2013-09-28 3 views
2

j'ai un haricot avec une liste de données globales dans @ApplicationScoped comme ceci:Incompatibilité avec @ManagedProperty

@ApplicationScoped 
@ManagedBean 
public class GlobalData 
{ 
    private List data = new ArrayList(); 

    //getter and setterss goes here.. 

    public void addSomeData(Object item) { data.add(item); } 
} 

aussi j'ai un haricot @ViewScoped qui fait référence GlobalData par un @ManagedProperty comme celui-ci:

@ManagedBean 
@ViewScoped 
public class SomePageController 
{ 
    @ManagedProperty(value="#{globalData}" 
    private GlobalData theGlobalData; 
    //also public getter and setter of theGlobalData 
} 

le plus drôle vient quand dans SomePageController je veux ajouter un élément à la liste des GlobalData comme ceci:

public void someUIAction() 
{ 
    SomeItem item = bussinesProcess(); 
    theGlobalData.addSomeData(item); 
} 

car à chaque fois que l'on appelle unUIAction, leGlobalData pointe vers une instance totalement nouvelle avec des données vides !!!! Je peux confirmer cela parce que j'ai ajouté quelques informations loggin comme ceci:

public void someUIAction() 
{ 
    SomeItem item = bussinesProcess(); 
    theGlobalData.addSomeData(item); 
    System.out.println(theGlobalData.toString()); 
} 

puis je suis la sortie suivante:

[email protected] 
[email protected] 
[email protected] 
...... 

une nouvelle instance à chaque demande, je googlé mais la seule information que je pouvais obtenez est avec this guy avec un problème similaire, encore j'ai aussi essayé il est la solution sans chance = (

** ** information additionnelle:. im développement avec tomee 1.5.2 profil web Wich inclut Apache MyFaces aussi j'ai vérifié que toutes les annotations sont de l'emballage javax.faces.bean

Répondre

1

Cela se produira si vous avez importé annotation @ApplicationScoped du mauvais paquet, comme javax.enterprise.context du CDI, qui est ce que la plupart des IDEs suggèrent que 1ère option de saisie semi-automatique . Comme vous gérez les beans par le @ManagedBean de JSF, vous devez vous assurer que vous utilisez également une portée bean gérée à partir de la même API de gestion du bean.

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

Lorsqu'un bean géré JSF ne dispose pas d'une annotation valide definied, puis la valeur par défaut @NoneScoped qui est dans ce cas en effet une marque nouvelle instance sur chaque EL-résolution, comme @ManagedProperty.

+0

ajouté un +1 car c'est une erreur assez commune mais j'ai juste chiné toutes les anontations et ils sont tous du paquet javax.faces.bean, honnêtement j'espérais que c'était la cause ... = S – Harima555

Questions connexes