我有一个问题,我的@ViewScoped托管bean的行为就像@RequestScoped托管bean一样,仅仅是因为我使用的是Composite:insertChildren标记。我已经阅读了有关该主题的其他文章,并且知道@ViewScopedmanagedBeans的局限性,但是我没有任何显式绑定,也没有在复合组件中使用JSTL。

我假设insertChildren标记已绑定到ManagedBean,但我希望那里的人可以让我摆脱困境,并向我展示解决方法-我真的不想开始使用@SessionScoped bean。 :)

这是我的简化示例。简单托管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及其组件移出复合组件,并替换为Composite:insertChildren标记,如下所示,当我输入一些文本并按Submit时,将显示正确的错误消息,但是由于@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>

有什么想法或建议吗?

提前致谢。

最佳答案

对于其他有相同问题的人:

这是JSF中的已知错误->更多信息,请参见http://java.net/jira/browse/JAVASERVERFACES-2040

可能的解决方法是将构面添加到组合界面,并使用cc:renderFacet而不是cc:insertChildren呈现构面。

关于java - JSF 2复合组件insertChildren标记将@ViewScoped转换为@RequestScoped :(,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4083499/

10-11 10:35