2013-03-27 29 views
5

Próbuję wprowadzić bezstanowego EJB do serwletu. Ale to nie działa. Czy zrozumiałem coś nie tak? Jeśli zrobię to w klasie z adnotacjami @WebService, mogę bez problemu użyć wstrzykniętego EJB.Wstrzyknięcie bezpaństwowca EJB do serwletu

Moje EJB:

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

Moja 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(); 
    } 

Powoduje to NullPointerException. Próbowałem wykonać wyszukiwanie JNDI i działało bardzo dobrze. Czy to fakt, że @Inject nie działa w Servletach?

im przy GlassFish 3.1.2.2

Odpowiedz

10

Próbujesz uzyskać do niego dostęp w konstruktorze. Wstrzykiwane zależności nie są dostępne w konstruktorze. Nie można ustawić zmiennej instancji, jeśli instancja nie jest jeszcze zbudowana. Jesteś w zasadzie spodziewałem się, że działa tak:

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

To wyraźnie nie jest to przypadek. Możesz uzyskać do niego dostęp najwcześniej w metodzie serwletu. Jest również dostępny w dowolnej metodzie serwletu.

Aby rozpocząć, należy wymienić

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

przez

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

Unrelated do konkretnego problemu, gorąco polecam do pracy na Java naming conventions. Małe i podkreślone nazwy klas nie są zgodne ze standardowymi konwencjami nazewnictwa Java, co spowalnia interpretację kodu przez doświadczonych programistów Java.