2013-03-11 9 views
6

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\""}}}} 

Antwort

9

Was @patlov vorschlägt, funktioniert, wenn Sie @Named auf Ihren CDI-Beans verwenden. Wenn Sie jedoch in einer Umgebung arbeiten, die CDI unterstützt, verwenden Sie nicht @ManagedBean. Verwenden Sie stattdessen CDI vollständig. Sehen Sie dieses answer und ich bin sicher, dass Sie zahlreiche andere finden konnten, die stark von dem ablehnen, was Sie versuchen zu tun.

Einfach von javax.faces.bean.SessionScoped zu javax.enterprise.context.SessionScoped wechseln und alles wird magisch funktionieren. Was Sie in Erfahrung bringen können, ist das Fehlen von @ViewScoped von CDI, in welchem ​​Fall verwenden Sie etwas wie JBoss Seam oder Apache Deltaspike, die es für Sie implementieren. Als zusätzlichen Vorteil werden sie automatisch alle JSF-Bereiche automatisch durch CDI-Bereiche ersetzen, wenn Sie bereits vorhandenen Code für JSF haben.

Aktualisierung: Dies sollte der Inhalt Ihrer Bohnen sein.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
</beans> 
+0

@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

+0

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

+0

Sie sagen auch in Ihrem Update, dass Sie eine Start-Ausnahme erhalten - können Sie den Stack-Trace dafür buchen? – rdcrng

1

Wenn Sie mit @ManagedBean Verwendung @ManagedProperty Eigenschaften zu injizieren:

@ManagedProperty(value = "#{baseBean}") 
private BaseBean dBean; 

// getter and setter 
3

Stellen Sie sicher, dass Sie CDI aktiviert haben, indem Sie eine WEB-INF/beans.xml Datei in Ihre Anwendung einfügen.

+0

Wenn ich es unter WEB-INF hinzufüge, wirft es einen Fehler beim Start des Servers: org.jboss.msc.service.StartException. Wenn ich es unter META-INF hinzufüge, startet es den Server, aber das Problem wird nicht entfernt. Immer noch eine NullPointerException. – arjacsoh

+1

Die 'StartException' ist die richtige Richtung. Wahrscheinlich bedeutet jetzt, dass CDI aktiviert ist, dass einige Probleme mit CDI auftreten, bevor CDI funktioniert. –

+0

habe ich irgendwie vermisst. Und StackTrace gibt auch keinen Hinweis darauf. –

Verwandte Themen