Witam.
Postanowiłem na pracę mgr przygotować aplikację, która będzie na serwerze tomcata używała Biblioteki struts 1.3.10 i spring 3.0 do wyświetlania danych pobranych z serwera jboss za pośrednictwem ejb3.0
Niestety po podpięciu stateles remote session beana, zamiast egzemplarza zdalnego interfejsy mam w zmiennej obiekt typu org.jnp.interfaces.NamingContext.
Kody:
W plik applicationContext.xml jest definicją beanów springa:
<!-- Globalny Zbiór ustawień dla session beanów -->
<util:properties id="connection_props">
<prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
<prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
<prop key="java.naming.provider.url">localhost:1099</prop>
</util:properties>
<!-- -->
<jee:remote-slsb business-interface="pl.bgora.beans.session.remote.NewsBeanRemote"
jndi-name="NewsBean" environment-ref="connection_props" id="newsBean" ></jee:remote-slsb>
<!-- Beany dla akcji struts -->
<bean name="/welcome" class="pl.bgora.actions.WelcomeAction">
<property name="newsBean">
<ref bean="newsBean" />
</property>
</bean>
Akcja struts jest podpięta przez proxy springa - nie będę tutaj przytaczał struts-config.xml, chyba, że ktoś stwierdzi, że trzeba.
Teraz tak, po stronie Jbossa mam session beana:
/**
* Session Bean implementation class NewsBean
*/
@Stateless(name = "NewsBean")
public class NewsBean implements NewsBeanRemote, NewsBeanLocal {
public static final int MAX_RECENT_NEWS = 10;
@PersistenceContext(unitName = "bms")
private EntityManager entityManager;
/**
* Default constructor.
*/
public NewsBean() {
// TODO Auto-generated constructor stub
}
@Override
public News findById(Long id) throws RemoteException {
return entityManager.find(News.class, id);
}
@Override
public void create(News entity) throws RemoteException {
entityManager.persist(entity);
}
@SuppressWarnings("unchecked")
@Override
public List<News> getRecentNews() throws RemoteException {
List<News> news = new ArrayList<News>();
StringBuilder builder = new StringBuilder(
"FROM News n ORDER BY n.newsDate ASC");
Query q = entityManager.createQuery(builder.toString());
q.setMaxResults(MAX_RECENT_NEWS);
news = q.getResultList();
return news;
}
@Override
public void update(News entity) throws RemoteException {
entityManager.merge(entity);
}
bean ten implementuje interfejs zdalny i lokalny.
Obydwa wyglądają tak samo:
@Remote
public interface NewsBeanRemote extends NewsBeanService {
}
NewsBeanService, to interfejs w którym zdefiniowane są metody "biznesowe" dla danego ejb i tak:
public interface NewsBeanService extends AbstractBeanService<News> {
public List<News> getRecentNews() throws RemoteException;
}
Ten z kolei interfejs, jak każdy interfejs biznesowy rozszerza podstawowy interfejs, w którym są ogólne metody dla każdego session beana:
public interface AbstractBeanService<T> {
/**
* Zapisuje obiekt encji do bazy
*
* @param entity
* obiekt encji do zapisania.
* @throws RemoteException
*/
public void create(T entity) throws RemoteException;
/**
* Zwraca obiekt Encji według id.
*
* @param id
* id szukanego obiektu.
* @return obiekt encji, lub null
* @throws RemoteException
*/
public T findById(Long id) throws RemoteException;
/**
* Zapisuje zmiany w istniejącym beanie encyjnym.
*
* @param entity
* entity bean do zapisu.
* @throws RemoteException
*/
public void update(T entity) throws RemoteException;
}
Teraz tak:
Uruchamiam jbossa.
W katalogu lib mojej aplikacji na tomcacie mam jara z definicjami interfejsów zdalnych i interfejsów biznesowych. Tak więc klient ma pojęcie o tym, jakie intefejsy poiwnien mieć.
Pierwsza strona zawierająca newsy pobierane przez ejb ma postać:
Plik klasy akcji:
public class WelcomeAction extends Action {
private NewsBeanRemote newsBean;
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// TODO: newsBean musi zwrócić 10 ostatnich wpisów w wiadomościach
List<News> news = newsBean.getRecentNews();
WelcomeForm welcomeForm = (WelcomeForm) form;
welcomeForm.setRecentNews(news);
return mapping.findForward(ActionResult.SUCCESS);
}
public NewsBeanRemote getNewsBean() {
return newsBean;
}
public void setNewsBean(NewsBeanRemote newsBean) {
this.newsBean = newsBean;
}
W momenice wykonywania kodu:
List<News> news = newsBean.getRecentNews();
w zmiennej newsBean jest egzemplarz klasy org.jnp.interfaces.NamingContext, zamiast pl.bgora.NewsBeanRemote, co powoduje rzucenie wyjątku:
2010-04-11 14:16:19 org.apache.struts.action.RequestProcessor processException
WARNING: Unhandled Exception thrown: class org.springframework.remoting.RemoteProxyFailureException
2010-04-11 14:16:19 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet action threw exception
java.lang.NoSuchMethodException: org.jnp.interfaces.NamingContext.getRecentNews()
at java.lang.Class.getMethod(Class.java:1605)
at org.springframework.remoting.rmi.RmiClientInterceptorUtils.invokeRemoteMethod(RmiClientInterceptorUtils.java:114)
at org.springframework.ejb.access.SimpleRemoteSlsbInvokerInterceptor.doInvoke(SimpleRemoteSlsbInvokerInterceptor.java:99)
at org.springframework.ejb.access.AbstractRemoteSlsbInvokerInterceptor.invokeInContext(AbstractRemoteSlsbInvokerInterceptor.java:141)
at org.springframework.ejb.access.AbstractSlsbInvokerInterceptor.invoke(AbstractSlsbInvokerInterceptor.java:189)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy1.getRecentNews(Unknown Source)
at pl.bgora.actions.WelcomeAction.execute(WelcomeAction.java:36)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:113)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:706)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:677)
at org.apache.struts.taglib.logic.ForwardTag.doForward(ForwardTag.java:121)
at org.apache.struts.taglib.logic.ForwardTag.doEndTag(ForwardTag.java:105)
at org.apache.jsp.index_jsp._jspx_meth_logic_005fforward_005f0(index_jsp.java:94)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:66)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
2010-04-11 14:16:19 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspException: Exception forwarding for name welcome: javax.servlet.ServletException: org.springframework.remoting.RemoteProxyFailureException: No matching RMI stub method found for: public abstract java.util.List pl.bgora.beans.session.bussiness.NewsBeanService.getRecentNews() throws java.rmi.RemoteException; nested exception is java.lang.NoSuchMethodException: org.jnp.interfaces.NamingContext.getRecentNews()
at org.apache.struts.taglib.logic.ForwardTag.doForward(ForwardTag.java:125)
at org.apache.struts.taglib.logic.ForwardTag.doEndTag(ForwardTag.java:105)
at org.apache.jsp.index_jsp._jspx_meth_logic_005fforward_005f0(index_jsp.java:94)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:66)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
Czy ktoś mógłby mi pomóc?
W sieci jest pełno tutoriali jak dobrać się do ejb 2.1.
Proszę o pomoc i pozdrawiam.
Pozdrawiam.