2013-03-27 4 views
5

Я пытаюсь вставить безгласный EJB в сервлет. Но он не работает. Я что-то понял неправильно? Если я делаю это в классе аннотированных @WebService, я могу без проблем использовать введенный EJB.Внедрение безгласного EJB в сервлет

Мой EJB:

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

Мой 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(); 
    } 

Это вызывает NullPointerException. Я пытался сделать JNDI-Lookup, и он работал очень хорошо. Это факт, что @Inject не работает в сервлетах?

Im используя Glassfish 3.1.2.2

ответ

10

Вы пытаетесь получить доступ к нему в конструкторе. Введенные зависимости недоступны в конструкторе. Невозможно установить переменную экземпляра, если экземпляр еще не сконструирован. Вы в основном ожидаете, что он будет работать следующим образом:

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

Это явно не тот случай. Вы можете получить к нему доступ как можно раньше в методе сервлета init(). Он также доступен только в любом из методов сервлетов doXxx().

Для начала, замените

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

по

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

неродственных к конкретной проблеме, я настоятельно рекомендую работать на вашем Java naming conventions. Имена классов нижнего и нижнего разрядов не соответствуют стандартным соглашениям об именах Java, что замедляет интерпретацию кода прикованными разработчиками Java.