Comment injecter un Bean CDI dans une ManagedBean?
Je veux injecter un Bean CDI dans une ManagedBean soit avec l'annotation @Inject ou @Produire. Le Bean CDI que j'utilise est:
@Named
@Startup
@ApplicationScoped
public class BaseBean {
private List<String> custs;
public List<String> getCusts() {
return custs;
}
public void setCusts(List<String> emps) {
this.custs = emps;
}
public BaseBean(){
}
@PostConstruct
void init() {
custs = new ArrayList<String>();
custs.add("Cust1");
custs.add("Cust3");
custs.add("Cust2");
custs.add("Cust4");
}
}
La ManagedBean, dans laquelle je veux injecter le CDI, la Fève est:
@SessionScoped
@ManagedBean
public class Hello implements Serializable {
@Inject
private BaseBean dBean;
private static final long serialVersionUID = 1L;
private List<String> customers;
private List<String> customersSelect;
public Hello() {
}
@PostConstruct
void init() {
// dBean = new BaseBean();
customers = dBean.getCusts();
}
public List<String> getCustomers() {
return customers;
}
public List<String> getCustomersSelect() {
return customersSelect;
}
public void setCustomersSelect(List<String> customersSelect) {
this.customersSelect = customersSelect;
}
}
Dans la fonction init cependant, il jette NullPointerException. Si j'utilise l'annotation @Produit au lieu de @Inject, le résultat est le même: NullPointerException. Est quelque chose de mal avec l'Bean CDI (mauvaise annotations)? Dois-je essayer de l'injecter avec une mauvaise façon? Est-ce que mon code manque de quelque chose? Comment puis-je le faire fonctionner? Voici le code JSF:
<h:form id ="f">
<h:selectManyCheckbox layout="pageDirection" border="1" value="#{hello.customersSelect}">
<f:selectItems value="#{hello.customers}"></f:selectItems>
</h:selectManyCheckbox><br />
<h:commandButton action="response.xhtml" value="Click me" />
</h:form>
PS: Si j'utilise un Stateless Bean BaseBean et je l'injecter avec l'annotation @EJB, il fonctionne sans problème.
Mise à JOUR: j'ai essayé avec les annotations @SessionScoped
(javax.enterprise.context.SessionScoped
) et @Named
sur le Hello
classe. Bien que je n'ai pas reçu NullPointerException
, le h:selectManyCheckbox
est vide. par ailleurs, il me semble, que lorsque j'ajoute le beans.xml
fichier sous META-INF
dossier, je reçois un StartException
, bien que le fichier est-il censé être. Je pense que mon application ne manque de la bonne configuration pour être capable de l'Injection de Dépendance. Ce qui est susceptible d'avoir besoin d'une configuration supplémentaire?
Mise à JOUR 2: Cette erreur s'affiche lorsque j'ajoute le beans.xml fichier dans le dossier WEB-INF. L'beans.xml le fichier est vide, il ne contient que la ligne :
<?xml version="1.0" encoding="UTF-8"?>
L'erreur est:
Services which failed to start: service jboss.deployment.unit."JSF1.war".PARSE: org.jboss.msc.service.StartException in service jboss.deployment.unit."JSF1.war".PARSE: Failed to process phase PARSE of deployment "JSF1.war"
12:51:11,482 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.deployment.unit.\"JSF1.war\".PARSE" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"JSF1.war\".PARSE: Failed to process phase PARSE of deployment \"JSF1.war\""}}}}
Vous devez vous connecter pour publier un commentaire.
Ce que @patlov suggère de travailler si vous utilisez
@Named
sur votre CDI haricots. Toutefois, si vous travaillez dans un environnement qui prend en charge la CDI, ne pas utiliser@ManagedBean
. Au lieu de cela, utilisez CDI tout le chemin. Voir ce réponse et je suis sûr que vous pourriez trouver de nombreux autres celles qui déconseillons fortement de ce que vous essayez de faire.Il suffit de passer de
javax.faces.bean.SessionScoped
àjavax.enterprise.context.SessionScoped
et tout fonctionne par magie. Ce que vous pouvez exécuter en est l'absense de@ViewScoped
du CDI toutefois, dans ce cas, utilisez quelque chose comme JBoss Seam ou Apache Deltaspike que mettre en œuvre pour vous. Comme un avantage supplémentaire, ils seront également automatiquement remplacer l'ensemble de la JSF étendues avec le CDI étendues automatiquement si vous disposez déjà de code écrit pour JSF.Mise à jour:
Ce doit être le contenu de votre beans.xml:
@Named
à toute bean CDI que vous souhaitez accessible à partir de l'EL (Expression Language), c'est à dire votre page. Donc, supprimer@ManagedBean
et ajouter@Named
àHello
. Comme pour l'exception, post la trace de la pile s'il vous plaît, ne peuvent pas savoir quel est le problème autrement.Assurez-vous que vous avez activé CDI en mettant un
WEB-INF/beans.xml
fichier dans votre application.StartException
est la bonne direction. Probablement signifie que désormais, le CDI est activé, vous avez quelques CDI questions liées au travail à travers avant de CDI travail.Si vous utilisez
@ManagedBean
utilisation@ManagedProperty
à injecter propriétés: