On Mar 14, 2006, at 10:15 AM, Aaron Mulder wrote:

This is actually a different problem -- it loaded the class
successfully, but isn't looking in the right place for the EJB.  I
think your target-name should have at least a J2EEApplication
component in it... perhaps something like:

<target- name>geronimo.server:J2EEApplication=null,J2EEModule=RemoteOperationEJ B.jar,J2EEServer=geronimo,j2eeType=StatelessSessionBean,name=RemoteOpe rationEJB</target-name>

I'm not sure if that's totally correct -- to be sure, you could go to
http://localhost:8080/debug-tool/ and search it for RemoteOperationEJB
and see if you see a line like the above (assuming the JMX Debug web
application is running).

I usually have to search the logs to find the actual name.


We should really have an easier way to refer to EJBs that were
deployed separately.  If the target-name above gives you trouble, you
could try replacing the target-name with
<ejb-link>RemoteOperationEJB</ejb-link> and see if we resolve that
correctly, though I'm bo no means sure that we would (that is, that we
would find the EJB in a standalone EJB JAR if you use ejb-link).

ejb-link won't work, it assumes we are in the same ear or ejb module (this will probably change in 1.1). However you can use the other form where you specify the name parts that are different, and use wildcards:

<application>null</application> <!-- or * -->
<module>*</module> <!-- or specify the actual module-->
<name>RemoteOperationEJB</name>

this is from memory so it might not be 100% correct, I suggest looking at the schema (geronimo-naming-1.0.xsd)

thanks
david jencks



Thanks,
    Aaron

On 3/14/06, Bruno Custodio - Datacomp DSCB <[EMAIL PROTECTED]> wrote:
Hi again,

First thing, thanks for your reply! Anyway, i made the changes you said but the problem persists. Looks like the web app is able to lookup the EJB through JNDI but then cannot reference the classes.

I built a sample JSP (see below), in which i now do the cast and not the narrow:

<%@ page import="com.datacomp.am.ejb.RemoteOperationHome,
                 com.datacomp.am.ejb.RemoteOperation,
                 javax.naming.InitialContext,
                 javax.naming.Context"%>
<html>
<head>
<title>EJB SAMPLE</title>
</head>
<body>
<% String sJNDI = "java:comp/env/ejb/RemoteOperationEJB";
   Context initCtx = new InitialContext();
   RemoteOperationHome home = null;
   try {
      home = (RemoteOperationHome) initCtx.lookup(sJNDI);
   } catch (Exception e)  {
      e.printStackTrace();
   }
%>
<BR>CTX of <%= sJNDI %>
<% RemoteOperation oRemoteOper = home.create(); %>
<BR>CREATE
</body>
</html>

When i call it i have the following error in the home.create() statement:

java.rmi.NoSuchObjectException: geronimo.server:J2EEServer=geronimo,j2eeType=StatelessSessionBean,nam e=RemoteOperationEJB org.openejb.proxy.EJBMethodInterceptor.createEJBInvocation (EJBMethodInterceptor.java:171) org.openejb.proxy.EJBMethodInterceptor.intercept (EJBMethodInterceptor.java:115) org.openejb.proxy.SessionEJBHome$$EnhancerByCGLIB$$345b112d.create (<generated>)
org.apache.jsp.teste_jsp._jspService(org.apache.jsp.teste_jsp:80)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:688)
org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java:322) org.apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:688)

In the servlet where i am still doing the narrow, the error is the same as in my first email...(produced in the actual narrow statement, the JNDI lookup passes through)
java.lang.NoClassDefFoundError

The only change to the XML descriptors was in the geronimo-web.xml that now looks like:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.0";
  xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.0";
  configId="TestPunch">
        <import><uri>RemoteOperationEJB</uri></import>
 <naming:ejb-ref>
  <naming:ref-name>ejb/RemoteOperationEJB</naming:ref-name>
<naming:target- name>geronimo.server:J2EEServer=geronimo,j2eeType=StatelessSessionBea n,name=RemoteOperationEJB</naming:target-name>
 </naming:ejb-ref>
</web-app>

One doubt that i have, do i need to include in WEB-INF/lib a JAR including any of the EJB classes, or does the web app gets all from its classpath once it manages to see the EJB correctly?

thanks again.

Best regards,
Bruno

________________________________

De: [EMAIL PROTECTED] em nome de Aaron Mulder
Enviada: ter 14-03-2006 14:01
Para: [email protected]
Assunto: Re: Web App calling standalone EJB



Try adding this to your geronimo-web.xml (above the ejb-ref):

<import>RemoteOperationEJB</import>

That should add the EJB clases to the classpath of the web app.  (In
JBoss, it tends to put all apps on the same class loader, but Geronimo
doesn't work that way.)

Also, a couple of less important notes:

1) You may want to remove the parentId from your openejb-jar.xml --
it's not necessary to list the default one like you have, and it ties
you to Geronimo 1.0 since you have the "1.0" version string in there.

2) You don't actually need PortableRemoteObject.narrow unless you're
calling the remote EJB via CORBA, which you are not.  A simple cast
will work.  You won't be able to run this application under JDK 1.5
with Geronimo 1.0 if you continue to use PRO.narrow

Thanks,
    Aaron

On 3/14/06, Bruno Custodio - Datacomp DSCB <[EMAIL PROTECTED]> wrote:

Hi there,

I've recently installed Geronimo v1.0. I am still adapting, as i was using
JBOSS previously.

In JBOSS i had a Web application (.war) and a separate EJB named
RemoteOperationEJB.jar. From the web application i was doing the lookup of the EJB with no problems, creating the object and calling its methods.

Now in Geronimo i'm having problems to replicate the same scenario. I was able to deploy the EJB and the WAR files separately but when i try to run
the web application and call the EJB i'm having a "NoClassDefFound"
exception in the narrow!

First of all, is this possible to do in Geronimo, having a web app calling a
EJB that are NOT part of a EAR?

If so, then i mostly sure have an error in the XML descriptors. Below i put
each of them:

EJB-JAR.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd";>
<ejb-jar>
   <enterprise-beans>
      <session>
         <ejb-name>RemoteOperationEJB</ejb-name>

<home>com.datacomp.am.ejb.RemoteOperationHome</home>


<remote>com.datacomp.am.ejb.RemoteOperation</remote>

<local-home>com.datacomp.am.ejb.RemoteOperationLocalHome</local- home>

<local>com.datacomp.am.ejb.RemoteOperationLocal</local>

<ejb-class>com.datacomp.am.ejb.RemoteOperationBean</ejb-class>
         <session-type>Stateless</session-type>
         <transaction-type>Container</transaction-type>

      </session>
   </enterprise-beans>
</ejb-jar>

openejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar
    xmlns="http://www.openejb.org/xml/ns/openejb-jar";
    configId="RemoteOperationEJB"
    parentId="geronimo/j2ee-server/1.0/car">
    <enterprise-beans>
        <session>
            <ejb-name>RemoteOperationEJB</ejb-name>
            <jndi-name>ejb/RemoteOperationEJB</jndi-name>
        </session>
    </enterprise-beans>
</openejb-jar>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee";
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd";
  version="2.4">

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.datacomp.tp.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

    <ejb-ref>
        <description>EJB Reference to the bean deployed to
OpenEJB</description>
       <ejb-ref-name>ejb/RemoteOperationEJB</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>

<home>com.datacomp.am.ejb.RemoteOperationHome</home>

<remote>com.datacomp.am.ejb.RemoteOperation</remote>
    </ejb-ref>
</web-app>

geronimo-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
 xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.0";
xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.0";
 configId="TestPunch">
 <naming:ejb-ref>
  <naming:ref-name>ejb/RemoteOperationEJB</naming:ref-name>

<naming:target- name>geronimo.server:J2EEModule=RemoteOperationEJB.jar,J2EEServer=ge ronimo,j2eeType=StatelessSessionBean,name=RemoteOperationEJB</ naming:target-name>
 </naming:ejb-ref>
</web-app>

In my JAVA code i'm doing the following:

      //reference to the remote object
      Object objref = null;
      try {
         //get initial context and lookup EJB
         objref =
ictx.lookup("java:comp/env/ejb/RemoteOperationEJB");
      } catch (NamingException e) {
         //some problem looking up the remote object
         e.printStackTrace();
         return null;
      }
      RemoteOperationHome home = (RemoteOperationHome)
PortableRemoteObject.narrow(objref, RemoteOperationHome.class);
      try  {
         return home.create();
      } catch (javax.ejb.CreateException ec)  {
         ec.printStackTrace();
      } catch (RemoteException re) {
         re.printStackTrace();
      }
      return null;
   }

And it gives that exception in the narrow command!


any possible help is welcome!

thanks in advance,

best regards,
Bruno Custódio







Reply via email to