Ich möchte eine CDI-Bean in einem ManagedBean entweder mit der Annotation @Inject oder @Produce injizieren. Die CDI Bean, die ich benutze, ist:Wie injiziere ich eine CDI Bean in einer ManagedBean?
@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");
}
}
Die ManagedBean, in dem ich die CDI Bean injizieren wollen, ist:
@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;
}
}
In der init-Funktion ist es jedoch wirft Nullpointer. Wenn ich die Annotation @Produces anstelle von @Inject verwende, ist das Ergebnis dasselbe: NullPointerException. Stimmt irgendetwas mit der CDI-Bean nicht (falsche Anmerkungen)? Versuche ich, es falsch zu injizieren? Fehlt meinem Code etwas? Wie kann ich es funktionieren lassen? Hier ist der JSF-Code:
<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: Wenn ich eine Stateless Bean als BaseBean verwenden und ich spritze es mit der Anmerkung @EJB, funktioniert es ohne Probleme.
UPDATE: habe ich versucht, es mit den Anmerkungen @SessionScoped
(javax.enterprise.context.SessionScoped
) und @Named
auf der Hello
Klasse. Obwohl ich keine NullPointerException
erhalte, ist die h:selectManyCheckbox
leer. Außerdem fällt mir auf, dass wenn ich die beans.xml
Datei unter META-INF
Ordner hinzufüge, erhalte ich eine StartException
, obwohl die Datei da sein soll. Ich denke, meiner Anwendung fehlt die richtige Konfiguration, um Dependency Injection ausführen zu können. Was wird wahrscheinlich zusätzliche Konfiguration benötigen?
UPDATE 2: Dieser Fehler wird angezeigt, wenn ich die Datei beans.xml im Ordner WEB-INF hinzufüge. Die beans.xml Datei ist leer, es enthält nur die Zeile:
<?xml version="1.0" encoding="UTF-8"?>
Der Fehler ist:
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\""}}}}
@arjacsoh Ich denke, ich hätte erwähnen sollen, dass Sie '@ Named' zu jeder CDI-Bean hinzufügen sollten, auf die Sie von der EL (Ausdrucksprache), d. H. Ihrer Seite, zugreifen können. Also, entferne '@ ManagedBean' und füge '@ Named' zu' Hello' hinzu. Wie für die Ausnahme, posten Sie die Stack-Trace bitte, kann nicht wissen, was sonst falsch ist. – rdcrng
Das habe ich getan. Ich habe @ ManagedBean durch @ Named ersetzt und zusätzlich die import Statement javax.enterprise.context.SessionScoped, wie du es angegeben hast. Die Daten werden nicht auf der JSF-Seite gerendert, wie ich es in meinem Update erkläre. – arjacsoh
Sie sagen auch in Ihrem Update, dass Sie eine Start-Ausnahme erhalten - können Sie den Stack-Trace dafür buchen? – rdcrng