Составной компонент JSF 2 Тег insertChildren превращает @ViewScoped в @RequestScoped :(

У меня возникла проблема, когда мой управляемый компонент @ViewScoped ведет себя как управляемый компонент @RequestScoped просто потому, что я использую тег составной:insertChildren. Я прочитал другие сообщения на эту тему и знаю об ограничениях управляемых компонентов @ViewScoped, но у меня нет явных привязок и я не использую JSTL в своем составном компоненте.

Я предполагаю, что тег insertChildren привязан к manageBean, но я надеюсь, что кто-нибудь сможет избавить меня от моих страданий и показать мне обходной путь - я действительно не хочу начинать использовать bean-компоненты @SessionScoped. :)

Вот мой упрощенный пример. Простой управляемый компонент:

@ManagedBean(name = "simpleMB")
@ViewScoped
public class SimpleManagedBean implements Serializable {

   private static final long serialVersionUID = -1;

   @NotNull
   @Email
   private String email;

   public SimpleManagedBean() {
      System.out.println("SimpleManagedBean");
   }

   @PostConstruct
   public void postConstruct() {
       System.out.println("Post construct");
   }

   public String submit() {
       return null;
   }

   ... setter and getter
}

Используя SimpleManagedBean выше с формой и составным компонентом (без insertChildren) ниже, все работает так, как ожидалось. Я ввожу какой-то текст, нажимаю «Отправить», и ошибка отображается вместе с введенным текстом. На данный момент я счастлив.

<h:form>
    <foo:simpleNoChildren />

    <h:commandButton id="submit" 
                     value="Submit" 
                     action="#{simpleMB.submit}" />
</h:form> 

... and the composite component ....

<composite:interface />
<composite:implementation>

<h:panelGrid columns="3">
    <h:outputText value="Email"  />

    <h:inputText id="email" 
                 value="#{simpleMB.email}"
                 required="true" />

    <h:message for="email" />
</h:panelGrid>

</composite:implementation>

Теперь, если я перемещаю panelGrid и его компоненты из составного компонента и заменяю тегом составной:insertChildren, как показано ниже, когда я ввожу некоторый текст и нажимаю кнопку отправки, отображается правильное сообщение об ошибке, но поскольку метод @PostConstruct вызывается снова, введенный текст больше не отображается. :(

<h:form>
  <foo:simple>

    <h:panelGrid columns="3">
     <h:outputText value="Email"  />           
     <h:inputText id="email" value="#{simpleMB.email}" required="true" />
         <h:message for="email" />
    </h:panelGrid>

  </foo:simple>       

  <h:commandButton id="submit" value="Submit" action="#{simpleMB.submit}" />
</h:form> 

... and my complicated composite component :) ...

<composite:interface /> 
<composite:implementation>
   <composite:insertChildren />
</composite:implementation>

Любые мысли или предложения?

Заранее спасибо.


person wiryRobot    schedule 03.11.2010    source источник


Ответы (1)


Для других людей с той же проблемой:

Это известная ошибка в JSF -> дополнительную информацию см. http://java.net/jira/browse/JAVASERVERFACES-2040

Возможный обходной путь — добавить фасет в составной интерфейс и визуализировать фасет с помощью cc:renderFacet вместо cc:insertChildren.

person crimp    schedule 03.11.2011