JSF中的循环管理Bean检测错误

4

我有两个页面A和B,我想在JSF中从A导航到B,然后从B返回到A。我在A的托管bean中设置了托管属性B,反之亦然,但问题是我收到了一个错误,如下: 托管bean循环检测。

  <managed-bean>
      <managed-bean-name>viewBulkMetalIssueBean</managed-bean-name>
      <managed-bean-class>com.cc.jas.web.manufacturing.bulkmetalissue.ViewBulkMetalIssueBean</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
      <managed-property>
       <property-name>viewJobcardBean</property-name>
       <property-class>com.cc.jas.web.manufacturing.jobcard.ViewJobcardBean</property-class>
       <value>#{viewJobcardBean}</value>
       </managed-property>


     </managed-bean>


    <managed-bean>
      <managed-bean-name>viewJobcardBean</managed-bean-name>
      <managed-bean-class>com.cc.jas.web.manufacturing.jobcard.ViewJobcardBean</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
       <property-name>viewBulkMetalIssueBean</property-name>
       <property-class>com.cc.jas.web.manufacturing.bulkmetalissue.ViewBulkMetalIssueBean</property-class>
       <value>#{viewBulkMetalIssueBean}</value>
       </managed-property>


      </managed-bean>

有没有解决方案或替代方案来解决这个问题?
2个回答

14

这确实是不可能的。如果没有这个检测,它只会导致托管属性设置的无限循环。

要解决这个问题,只需在“父”bean注入后让其自身设置“子”bean即可。

public class Parent {
    private Child child;

    public void setChild(Child child) {
        this.child = child;
        this.child.setParent(this);
    }

    // ...
}

使用

<managed-bean>
    <managed-bean-name>parent</managed-bean-name>
    <managed-bean-class>com.example.Parent</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>child</property-name>
        <property-class>com.example.Child</property-class>
        <value>#{child}</value>
    </managed-property>
</managed-bean>

<managed-bean>
    <managed-bean-name>child</managed-bean-name>
    <managed-bean-class>com.example.Child</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

当我从子页面导航回父页面时,它将抛出空指针异常。从父页面导航到子页面正常工作。 - chetan
1
显然你做得太早了。在@PostConstruct或之后再做,而不是在构造函数中,因为setter方法还没有被调用。顺便说一下,如果允许这样的循环注入,你将会遇到完全相同的问题 :) - BalusC

4
你的JSF托管bean中不能有循环依赖。这在MyFaces wiki中有很好的解释。
另一种解决方案是使用EL解析器(适用于JSF 1.2)在你的托管bean中从Java代码查找引用。
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication()
    .getELResolver().getValue(elContext, null, "neededBean");

请参阅MyFaces维基页面以获取更多解释,并了解其他JSF版本的实现。

我可以知道getValue()方法的中间值是多少吗? - chetan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接