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.