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检测错误的主要内容,如果未能解决你的问题,请参考以下文章