2013-03-27 9 views
5

injizieren Ich versuche, ein Stateless EJB in Servlet zu injizieren. Aber es funktioniert nicht. Habe ich etwas falsch verstanden? Wenn ich dies in einer annotierten Klasse @WebService mache, kann ich das injizierte EJB ohne Probleme verwenden.Ein Stateless EJB in Servlet

Meine EJB:

@Stateless 
public class doSomethingService 
{ 
    public void doSomething() 
    { 
    System.out.println("DO SOMETHING"); 
    } 
} 

Mein Servlets:

@WebServlet("/testservlet") 
public class test_servlet extends HttpServlet 
{ 
    private static final long serialVersionUID = 1L; 

    @Inject 
    private doSomethingService injBean; 

    public test_servlet() 
    { 
    super(); 
    injBean.doSomething(); 
    } 

Dies führt zu einer NullPointerException. Ich habe versucht, ein JNDI-Lookup zu machen und es hat sehr gut funktioniert. Ist es eine Tatsache, dass @Inject nicht in Servlets funktioniert?

Im Glassfish mit 3.1.2.2

Antwort

10

Sie versuchen, es in den Konstruktor zugreifen. Die injizierten Abhängigkeiten sind im Konstruktor nicht verfügbar. Es ist nicht möglich, eine Instanzvariable zu setzen, wenn die Instanz noch nicht konstruiert ist. Sie erwarten grundsätzlich, dass es wie folgt funktioniert:

test_servlet servlet; 
servlet.injBean = new doSomethingService(); 
servlet = new test_servlet(); 

Dies ist eindeutig nicht der Fall. Sie können frühestens in der Methode init() des Servlets darauf zugreifen. Es ist auch nur in einer der doXxx() Methoden des Servlets verfügbar.

zu starten, ersetzen

public test_servlet() { 
    super(); 
    injBean.doSomething(); 
} 

von

@Override 
public void init() { 
    injBean.doSomething(); 
} 

Unrelated auf das konkrete Problem, empfehle ich auf Java naming conventions zu arbeiten. Die kleingeschriebenen und unterstrichenen Klassennamen entsprechen nicht den standardmäßigen Java-Namenskonventionen, was die Interpretation des Codes durch erfahrene Java-Entwickler verlangsamt.