JSF中的循环managebean检测错误

Posted

技术标签:

【中文标题】JSF中的循环managebean检测错误【英文标题】:cyclic managebean detection error in JSF 【发布时间】:2011-05-14 21:58:54 【问题描述】:

我必须浏览 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>

这个问题有什么解决方案或替代解决方案吗?

【问题讨论】:

【参考方案1】:

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

要解决这个问题,只需在“父”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>

【讨论】:

当我从孩子导航到父母时,它会抛出空指针异常。从父母到孩子工作正常 显然你做得太早了。在@PostConstruct 或更高版本中执行此操作,而不是在构造函数中执行此操作,仅仅是因为尚未调用 setter。顺便说一句,当像这样允许循环注入时,你会遇到完全相同的问题:)【参考方案2】:

您不能在 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 wiki entry 以获得进一步的解释,以及其他 JSF 版本的实现。

【讨论】:

我能知道 getValue() 方法的中间值是多少吗?

以上是关于JSF中的循环managebean检测错误的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0 web.xml 错误页面状态码

配置到jsf中的错误页面时出错?

如何检测当前的 JSF 版本?

验证通常失败时 JSF 中的条件样式

jsf中的异常处理 - 在新页面中打印错误消息

访问 JSF / facelets 中的请求参数的过滤器导致错误编码