Проблема с EJB - Бин и сервлет с сохранением состояния - PullRequest
1 голос
/ 01 января 2012

У меня есть код сервлета, который вызывает код сессионного компонента ejb с сохранением состояния следующим образом:

public class UsesBeansSF extends HttpServlet {   
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
          // do something
       }

    finally {}
 } 

private SessionBeanSFRemote lookupSessionBeanSFRemote() {
    try {
        Context c = new InitialContext();
        return (SessionBeanSFRemote) c.lookup("java:global/MyEJBSF/SessionBeanSF!ejbSF.SessionBeanSFRemote");
    } catch (NamingException ne) {
        Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
        throw new RuntimeException(ne);
    }
}

}

Этот код хорошо работает без строки между * отметками.Однако, когда я добавляю SessionBeanSFRemote sessionBeanSF = lookupSessionBeanSFRemote () этой строки (означает вызов Stateful Session Bean), код выдает ошибку.На самом деле, я должен вызвать сессионный компонент без сохранения состояния, чтобы выполнить какую-то работу.Кто-нибудь может мне помочь, почему это происходит?Заранее спасибо.

Сообщение об ошибке следующее:

тип Сообщение об исключении

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

исключение

javax.servlet.ServletException: PWC1392: Error instantiating servlet class websSF.comsSF.UsesBeansSF

первопричина

com.sun.enterprise.container.common.spi.util.InjectionException: 
         Error creating managed object for class websSF.comsSF.UsesBeansSF

первопричина

java.lang.reflect.InvocationTargetException

первопричина

java.lang.RuntimeException: javax.naming.NamingException: 
Lookup failed for 'java:global/MyEJBSF/SessionBeanSF!ejbSF.SessionBeanSFRemote' in SerialContext  
[Root exception is javax.naming.NamingException: 
ejb ref resolution error for remote business interfaceejbSF.SessionBeanSFRemote [Root exception is java.lang.NullPointerException]]

основная причина

javax.naming.NamingException: 
Lookup failed for 'java:global/MyEJBSF/SessionBeanSF!ejbSF.SessionBeanSFRemote' in SerialContext  
[Root exception is javax.naming.NamingException: 
ejb ref resolution error for remote business interfaceejbSF.SessionBeanSFRemote
[Root exception is java.lang.NullPointerException]]

основная причина

javax.naming.NamingException: ejb ref resolution error for remote business 
interfaceejbSF.SessionBeanSFRemote [Root exception is java.lang.NullPointerException]

основная причина

java.lang.NullPointerException
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.0.1 logs.

Сервер: GlassFish Server с открытым исходным кодом, версия 3.0.1

1 Ответ

3 голосов
/ 01 января 2012

Я не уверен, правильно ли вы настроили свой компонент Stateful. Вы можете попробовать это:

@Stateful(mappedName = "ejb/myStatefulBean")
public class MyStatefulBean implements MyStatefulRemoteInterface {
   // Your implementation
}

, тогда вы можете посмотреть:

InitialContext context = new InitialContext();
MyStatefulRemoteInterface myStatefulBean = (MyStatefulRemoteInterface) context.lookup("ejb/myStatefulBean");

Кроме того, этот bean-компонент с состоянием должен быть сохранен в сеансе каждого клиента для повторного использования:

HttpSession clientSession = request.getSession(false);
clientSession.setAttribute("myStatefulBean", myStatefulBean);

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

...