problem in EJB example in JBoss 4.0.5 or JBoss 4.2.1
vkviswanadh Sep 21, 2007 1:53 PMHi all, I am a new bie in JBoss world. I am trying to run a small application which prints current time .
I am trying to do this work using EJB 2.0 and JSP.
I created a jar file which is having EJB class files as well as ejb deployment descriptors, JBoss required DDs. (i.e., ejb-jar.xml and jboss.xml)
Then I made a jsp page which contains a JNDI call from that to access the EJB Home interface (normal EJB client call).With this I prepared a war file with all the required DD files (web.xml etc).
Now I prepared a ear file with jar file and war file , application.xml file and trying to deploy the application in JBoss. Once it was deployed in the server (deploying properly with out throwing any error), and trying to call the jsp page from browser
http://localhost:8080/test/firstEJB.jsp
it is throwing error at the browser as
-----------------------------------------------------------------------------
org.apache.jasper.JasperException: An exception occurred processing JSP page /firstEJB.jsp at line 14
11: props.put(Context.PROVIDER_URL, "localhost:1099");
12:
13: Context ctx = new InitialContext(props);
14: FirstHome home = (FirstHome)ctx.lookup("ejb/First");
15: First bean = home.create();
16: String time = bean.getTime();
17: bean.remove();
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:518)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
root cause
javax.servlet.ServletException: java.lang.LinkageError: loader constraints violated when linking javax/ejb/Handle class
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:855)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:784)
org.apache.jsp.firstEJB_jsp._jspService(firstEJB_jsp.java:94)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:387)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
root cause
java.lang.LinkageError: loader constraints violated when linking javax/ejb/Handle class
java.lang.Class.getDeclaredFields0(Native Method)
java.lang.Class.privateGetDeclaredFields(Class.java:2232)
java.lang.Class.getDeclaredField(Class.java:1852)
java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1555)
java.io.ObjectStreamClass.access$600(ObjectStreamClass.java:47)
java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:381)
java.security.AccessController.doPrivileged(Native Method)
java.io.ObjectStreamClass.(ObjectStreamClass.java:373)
java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:268)
java.io.ObjectStreamClass.initProxy(ObjectStreamClass.java:464)
java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1502)
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
java.rmi.MarshalledObject.get(MarshalledObject.java:135)
org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
org.jnp.interfaces.NamingContext.lookup(NamingContext.java:652)
org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
javax.naming.InitialContext.lookup(InitialContext.java:351)
org.apache.jsp.firstEJB_jsp._jspService(firstEJB_jsp.java:68)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:387)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
-----------------------------------------------------------------------------------
my EJBHOme is
------------------
package com.stardeveloper.ejb.session;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
// Referenced classes of package com.stardeveloper.ejb.session:
// First
public interface FirstHome
extends EJBHome
{
public abstract First create()
throws CreateException, RemoteException;
}
------------------------------------------------------------
my Remote Interface is
package com.stardeveloper.ejb.session;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface First
extends EJBObject
{
public abstract String getTime()
throws RemoteException;
}
--------------------------------------------------------
my EJB Sesion Bean is
package com.stardeveloper.ejb.session;
import java.util.Date;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class FirstEJB
implements SessionBean
{
public FirstEJB()
{
}
public String getTime()
{
return "Time is : " + (new Date()).toString();
}
public void ejbCreate()
{
}
public void ejbPassivate()
{
}
public void ejbActivate()
{
}
public void ejbRemove()
{
}
public void setSessionContext(SessionContext sessioncontext)
{
}
}
-------------------------------------------------
My JSP page which is trying to access the EJB is
<%@ page import="javax.naming.InitialContext,
javax.naming.Context,
java.util.Properties,
com.stardeveloper.ejb.session.First,
com.stardeveloper.ejb.session.FirstHome"%>
<%
long t1 = System.currentTimeMillis();
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
props.put(Context.PROVIDER_URL, "localhost:1099");
Context ctx = new InitialContext(props);
FirstHome home = (FirstHome)ctx.lookup("ejb/First");
First bean = home.create();
String time = bean.getTime();
bean.remove();
ctx.close();
long t2 = System.currentTimeMillis();
%>
p { font-family:Verdana;font-size:12px; }
Message received from bean = "<%= time %>".Time taken :
<%= (t2 - t1) %> ms.
---------------------------------
my ejb-jar.xml is
<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">
<ejb-jar>
<enterprise-beans>
<display-name>FirstEJB</display-name>
<ejb-name>First</ejb-name>
com.stardeveloper.ejb.session.FirstHome
com.stardeveloper.ejb.session.First
<ejb-class>com.stardeveloper.ejb.session.FirstEJB</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<ejb-name>First</ejb-name>
<method-name>*</method-name>
<trans-attribute>Supports</trans-attribute>
</container-transaction>
<security-role>
Users
<role-name>users</role-name>
</security-role>
</assembly-descriptor>
</ejb-jar>
----------------------------------------
my jboss.xml is
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS//EN"
"http://www.jboss.org/j2ee/dtd/jboss.dtd">
<enterprise-beans>
<ejb-name>First</ejb-name>
<jndi-name>ejb/First</jndi-name>
</enterprise-beans>
--------------------------------------
One of the solution for this would be , if I put the EJB jar file (the jar file which is having all the ejb classes as well as deployment descriptors inside that ) inside the war file WEB-INF\lib folder. Then it is working fine , showing the page at the browser.
Suppose if it is a very big application and I can't put that at war\WEB-INF\lib folder. This is not the way to put.
SO any body please put some light on this...What I need to do to work with out putting my ejb jar file inside the war file.
Thanks!
vvk