Stateless Sessionbeans via lookup.
taggat Aug 12, 2005 11:03 AMI have a session bean that i am testing, and cannot get the session bean to load correctly, I keep getting a class cast in my struts action.
The code is as follows:
UserSessionBean.java
==============
package com.flytxt.session;
import java.util.Iterator;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.flytxt.global.intf.session.UserSessionLocal;
import com.flytxt.global.intf.session.UserSessionRemote;
import com.flytxt.global.vo.ContactVO;
@Stateless
@Remote(UserSessionRemote.class)
@Local(UserSessionLocal.class)
public class UserSessionBean implements UserSessionLocal, UserSessionRemote {
@PersistenceContext (name="globalManager")
private EntityManager manager;
public ContactVO getContact(Integer id) {
System.out.println("got here");
return new ContactVO();
}
}
UserSessionLocal.java
==============
package com.flytxt.global.intf.session;
import javax.ejb.Local;
@Local
public interface UserSessionLocal extends UserSession
{
}
UserSessionRemote.java
package com.flytxt.global.intf.session;
import javax.ejb.Remote;
@Remote
public interface UserSessionRemote extends UserSession{
}
UserSession.java
===========
package com.flytxt.global.intf.session;
import com.flytxt.global.vo.ContactVO;
public interface UserSession {
public ContactVO getContact(Integer id);
}
My action class is very basic, and looks to me exactly like the example classes. Both the ejb and web app are running in the same instance of jboss.
WelcomeAction.java
=============
package com.flytxt.admin.actions;
import javax.naming.InitialContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.flytxt.global.intf.session.UserSession;
import com.flytxt.global.intf.session.UserSessionLocal;
import com.flytxt.global.intf.session.UserSessionRemote;
public class WelcomeAction extends Action {
public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
InitialContext ctx = new InitialContext();
Object o = ctx.lookup(UserSessionLocal.class.getName());
System.out.println(o + "==" + o.getClass().getName());
System.out.println("UserSessionLocal: " + (o instanceof UserSessionLocal));
System.out.println("UserSessionRemote: " + (o instanceof UserSessionRemote));
System.out.println("UserSession: " + (o instanceof UserSession));
UserSession us = (UserSession) ctx.lookup(UserSessionLocal.class.getName());
us.getContact(new Integer(1));
return actionMapping.findForward("menuframe");
}
}
The output from running this is:
16:01:56,046 INFO [STDOUT] com.flytxt.session.UserSessionBean==$Proxy70
16:01:56,046 INFO [STDOUT] UserSessionLocal: false
16:01:56,046 INFO [STDOUT] UserSessionRemote: false
16:01:56,046 INFO [STDOUT] UserSession: false
16:01:56,078 WARN [RequestProcessor] Unhandled Exception thrown: class java.lang.ClassCastException
16:01:56,078 ERROR [[admin]] Servlet.service() for servlet admin threw exception
java.lang.ClassCastException: $Proxy70
at com.flytxt.admin.actions.WelcomeAction.execute(WelcomeAction.java:48)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:153)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:595)
Any help as to why this does not work would be much appreciated.
I don't have a jboss.xml file, but my understanding is that it is not needed with EJB3.0