EJB Stateless Session Bean - не удалось создать ошибку - PullRequest
2 голосов
/ 30 апреля 2011

Позвольте мне начать с того, что пока я уже некоторое время использую Java SE, это мой первый набег на территорию Java EE. Я использую Netbeans 6.9 и генератор кода Netbeans, чтобы выполнить большую часть тяжелой работы (подробнее об этом ниже). Версия GlassFish 3 - стандартная версия, которая поставляется при загрузке Netbeans.

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

@Stateless
public class SDBSStatelessSessionBean implements SDBSStatelessSessionBeanRemote {

    @Override
    public String sayHello() {
        return "This seems to be working just fine.";
    }     
}

с определением интерфейса как:

@Remote
public interface SDBSStatelessSessionBeanRemote {

   String sayHello();
}

Класс и интерфейс были созданы с помощью функции «Вставить код», которую предоставляет Netbeans. Я полагаю, что таким образом я избегаю глупых ошибок новичка (о, ирония).

Моя проблема заключается в том, что когда я пытаюсь вызвать компонент EJB из сервлета (вызов был добавлен с помощью опции 'Call Enterprise Bean' из генератора кода Netbeans), я получаю следующую ошибку:

javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB

исключение вызвано: NoClassDefFoundError

Вот как сервлет делает вызов:

@EJB
private SDBSStatelessSessionBeanRemote sDBSStatelessSessionBean;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Test Servlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>" + sDBSStatelessSessionBean.sayHello()  +"</p>");
        out.println("</body>");
        out.println("</html>");
    } catch (Exception e) {
        out.println("<p>" + e.getMessage() + "</p>");
        out.println("</body>");
        out.println("</html>");
    } finally {
        out.close();
    }
}

Боюсь, что я не смог найти решение этой проблемы после интенсивного поиска в Google (в основном потому, что в нескольких сообщениях на форуме, которые, кажется, приближаются к этой проблеме, содержится слишком много жаргонизмов, чтобы я мог следовать решению).

Я бы очень буду благодарен за любой совет / помощь, указывающую мне правильное направление.

1 Ответ

3 голосов
/ 01 мая 2011

Если это локальный EJB (в том же контейнере JVM / EE, что и ваш сервлет), вы можете попытаться объявить свой EJB как @LocalBean (под аннотацией @Stateless). Вы также можете удалить интерфейс @Remote (и заставить ваш EJB-логер его не реализовывать).

Итак, ваш EJB станет

@Stateless
@LocalBean
public class SDBSStatelessSessionBean
{
    public String sayHello() 
    {
        return "This seems to be working just fine.";
    }     
}
...