Использование EJB в Wicket WebPage
Когда я использую аннотацию @EJB для доступа к EJB без сохранения состояния через удаленный интерфейс в общем HttpServlet, все работает нормально:
public class ListMsgs extends HttpServlet
{
@EJB
private Msgs msgsRI;
...
protected void processRequest(...) ...
{
List msgs = msgsRI.getAll();
...
}
...
}
Но когда я пытаюсь сделать то же самое в Wicket WebPage, я получаю нулевое значение в обмен на bean-компонент:
public class ListM extends WebPage
{
@EJB
private Msgs msgsRI;
...
public ListM()
{
List msgs = msgsRI.getAll(); // NullPointerException
...
}
...
}
Вот несколько строк этого "неожиданного исключения RuntimeException":
WicketMessage: Can't instantiate page using constructor public testapp.web.ListM()
Root cause:
java.lang.NullPointerException
at testapp.web.ListM.<init>(ListM.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:192)
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:57)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:298)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:320)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234)
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92)
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250)
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428)
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479)
at org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:138)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
....
Существуют ejb-модуль с bean и web-модулем с веб-страницей сервлета и калитки, развернутый на сервере GlassFish v2.1.1 (если это имеет смысл).
Что я должен сделать, чтобы использовать мой корпоративный компонент через удаленный интерфейс на веб-странице калитки?
2 ответа
Проект интеграции Java EE можно найти здесь: http://wicketstuff.org/confluence/display/STUFFWIKI/wicket-contrib-javaee
Поскольку создание экземпляров компонента Wicket не управляется контейнером DI, он должен обеспечивать механизм внедрения прокси. Существует стандартный способ реализации этого, основанный на классе org.apache.wicket.injection.Injector.
В дополнение к предыдущему ответу: из-за стиля ejb3 это лучший способ объявить элемент name в аннотации @Stateless на 1-м шаге, а не весь 3-й шаг в использовании ejb-аннотации.