2015-07-29 2 views
3

Я гугл без удачи, пытаясь понять, почему Liberty Profile 8.5.5.6 не впрыснуть EJB в сервлетLiberty профиль не инъекционный в сервлете EJB

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

Exception thrown by application class 'org.javaee7.servlet.simple.UserServlet.doGet:23' 
java.lang.NullPointerException: 
at org.javaee7.servlet.simple.UserServlet.doGet(UserServlet.java:23) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1285) 
at [internal classes] 

На this ссылки, которую я видел комментарий, который я должен использовать @ManagedBean

Когда я пытаюсь это, исключение нулевого указателя уходит, но теперь я получаю эту ошибку:

Error 404: javax.servlet.UnavailableException: SRVE0319E: For the [UserServlet] servlet, org.javaee7.servlet.simple.UserServlet servlet class was found, but a resource injection failure has occurred. CWNEN0030E: The server was unable to obtain an object instance for the java:comp/env/org.javaee7.servlet.simple.UserServlet/service reference. The exception message was: The EJB reference in the lps.war module of the lps application could not be resolved; nested exception is: com.ibm.ejs.container.EJBNotFoundException: EJB with interface org.javaee7.service.UserService not present in application lps. 

Вот мой код:

@Stateless 
public class UserServiceImpl implements UserService { 
    public User getUser(Long id) { 
     return new User(id, "Gary"); 
    } 
} 

@Remote 
public interface UserService { 
    public User getUser(Long id); 
} 

@ManagedBean 
public class UserServlet extends HttpServlet { 
    @EJB(mappedName = "UserServiceImpl") 
    UserService service; 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     User user = service.getUser(1L); 
     response.getWriter().print(user == null ? "no user" : user.toString()); 
    } 
} 

ответ

2

Первое - наверняка вы не должны использовать @ManagedBean. Сервлет не является управляемым компонентом. Вам не нужно, чтобы инъекция работала. Вы должны иметь либо @WebServlet в своем сервлете, либо настроить его через web.xml.
Второй - вы должны удалить mappedName, так как Liberty не использует это.

Пожалуйста, добавьте server.xml на ваш вопрос, так как вам могут быть недостатки в некоторых функциях.
У вас должен быть ejbRemote-3.2 или javaee-7.0.

Для удаленных интерфейсов, которые вы должны использовать следующие привязки:

@EJB(lookup="java:global/AppName/ModuleName/UserServiceImpl!org.javaee7.service.UserService") 
private UserService service; 

Вы также можете использовать другие привязки, как показано ниже в зависимости от вашей конфигурации:

java:global/ExampleApp/ExampleModule/ExampleBean!com.ibm.example.ExampleRemoteInterface  
java:app/ExampleModule/ExampleBean!com.ibm.example.ExampleRemoteInterface  
java:module/ExampleBean!com.ibm.example.ExampleRemoteInterface 

Когда боб является обязательной, вы должны увидеть в журнале регистрируется следующее сообщение:

[INFO ] CNTR0167I: The server is binding the com.ibm.example.ExampleRemoteInterface interface of the ExampleRemote enterprise bean in the Example.war module of the Example application. 
The binding location is: java:global/Example/ExampleRemote!com.ibm.example.ExampleRemoteInterface 

ОБНОВЛЕНИЕ
В том же приложении только @EJB без каких-либо поисковых работ для меня тоже.

Смотрите также для более подробной информации:

+0

Что бы AppName и ModuleName быть, когда я развернуть войну файл lps.war – javapenguin

+0

@javapenguin В случае одной войны это должно быть просто имя модуля, поэтому 'java: global/lps/UserServiceImpl! org.javaee7.service.UserService' – Gas

+0

Как только я удалил web.xml это сработало. Похоже, если вы используете аннотации (@WebServlet), вы должны придерживаться их. – javapenguin

Смежные вопросы