2010-11-24 20 views
3

Je dois pages A et B, je veux naviguer de A à B et de retour de B à A dans JSF. J'ai mis la propriété gérée B dans le bean géré de A et vice versa mais le problème est que j'ai eu une erreur comme DÉTECTION CYCLIQUE de BEAN GÉRÉE.erreur de détection managebean cyclique dans JSF

<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> 

Existe-t-il une solution ou une solution alternative pour ce problème?

Répondre

12

Ce n'est en effet pas possible. Sans cette détection, cela conduirait uniquement à une boucle infinie du paramètre de propriété gérée. Pour contourner cela, laissez simplement le haricot "parent" se placer dans le "enfant" haricot quand il a été injecté.

public class Parent { 
    private Child child; 

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

    // ... 
} 

Avec

<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> 
+0

Il lancera une exception de pointeur nul lorsque je naviguerai vers le parent à partir de l'enfant. du parent à l'enfant fonctionne bien – chetan

+1

Apparemment, vous le faites trop tôt. Faites-le dans '@ PostConstruct' ou plus tard, pas dans le constructeur, simplement parce que le setter n'est pas encore appelé. Vous auriez d'ailleurs exactement le même problème lorsque l'injection cyclique a été autorisée comme ça :) – BalusC

+0

Soory c'est ma faute ça va fonctionner, merci pour la réponse – chetan

2

Vous ne pouvez pas avoir d'injections cycliques dans vos beans gérés JSF. Ceci est expliqué bien dans le MyFaces wiki.

Une solution alternative est de rechercher la référence du code Java au sein de votre bean géré à l'aide d'un résolveur EL (pour JSF 1.2):

ELContext elContext = FacesContext.getCurrentInstance().getELContext(); 
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication() 
    .getELResolver().getValue(elContext, null, "neededBean"); 

Voir la MyFaces wiki entry pour de plus amples explications et mises en œuvre pour les autres versions JSF .

+0

Il fonctionne parfaitement – chetan

+0

Il est cependant un moyen aki. – BalusC

+0

puis-je savoir quelle est la valeur moyenne de la méthode getValue()? – chetan