2010-11-24 50 views
3

我必须页面A和B,我想从A导航到B,然后从JS导航回到B.我在A的托管bean中设置托管属性B,反之亦然,但问题是我得到了一个错误,如 管理bean循环检测。JSF中的循环管理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> 

是否有任何解决方案或替代解决方案的这个问题?

回答

12

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

为了解决这个问题,只需让“父”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> 
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版本实现。

+0

它的工作原理完美 – chetan 2010-11-24 12:01:04

+0

它。然而哈克的方式。 – BalusC 2010-11-24 12:04:20