2013-03-27 20 views
5

Sto tentando di iniettare un EJB senza stato nel servlet. Ma non funziona. Ho capito qualcosa di sbagliato? Se faccio questo in una classe con annotazione @WebService, posso utilizzare il bean iniettato senza problemi.Iniezione di un EJB stateless in Servlet

mio EJB:

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

mia Servlet:

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

    @Inject 
    private doSomethingService injBean; 

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

Questo provoca un NullPointerException. Ho provato a fare una ricerca JNDI e ha funzionato molto bene. È un fatto che @Inject non funzioni in Servlet?

Im usando Glassfish 3.1.2.2

risposta

10

si sta cercando di accedervi nel costruttore. Le dipendenze iniettate non sono disponibili nel costruttore. Non è possibile impostare una variabile di istanza se l'istanza non è ancora stata costruita. In pratica ti stai aspettando che funzioni in questo modo:

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

Questo chiaramente non è il caso. È possibile accedervi al più presto nel metodo init() del servlet. È anche disponibile solo in uno qualsiasi dei metodi doXxx() del servlet.

Per iniziare, sostituire

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

da

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

Estranei al problema concreto, vi raccomando vivamente di lavorare sul vostro Java naming conventions. I nomi di classi minuscole e sottolineate non sono conformi alle convenzioni di denominazione Java standard, il che rallenta l'interpretazione del codice da parte degli sviluppatori Java esperti.