JSF 2 Составной компонент insertChildren превращает тег @ViewScoped в @RequestScoped :( - PullRequest
4 голосов
/ 03 ноября 2010

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

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

Вот мой упрощенный пример. The Simple Managed Bean:

@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) ниже, все работает как положено. Я ввожу некоторый текст, нажимаю Submit, и вместе с введенным текстом отображается ошибка. На данный момент я счастлив.

<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>

Есть мысли или предложения?

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

1 Ответ

2 голосов
/ 03 ноября 2011

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

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

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

...