Thanks for all help so far Lasantha!

However, I have not been able to get my test case work yet. More questions:

OK, I understand the concept of writing EJBs and then tell the EJB container about how to run the EJBs by providing that kind of information in XML-files specifying names, URL-access-paths and other stuff. In that way one single application can run in many different EJB containers (or applications servers) just by modifying the XML-files not the program code.

In your example here you have changed the servlet code to include imports of the home and remote interface:
import com.test.ejb.MyTest;
import com.test.ejb.MyTestHome;

They appears as part of the com.test.ejb package. Note, I never put my EJB nor the interfaces in a package. Is the package necessary?

You never wrote the content of the application.xml file. What should the contents of the
applications.xml file be?

What is correct, to have one web.xml or one geronimo-web.xml or both? What's the difference between web.xml and geronimo-web.xml? What is correct about application.xml and geronimo-application.xml

In the servlet I use
Object objref = initial.lookup("java:comp/env/ejb/MyTest");
I guess that "java:comp/env/ejb/MyTest" is some sort of URL that the container will use to return the right object (in this case an interface). Now, what are the rules of the lookup-string? In a normal web-url eg. http://www.freefarm.se/foo/bar/test.html the http:// part is the protocol, <http://www.freefarm.se/>www.freefarm.se is the domain, foo/bar corresponds to directories and test.html is the file to ret rive and show in the users browser. But what is "java:" in java:comp/env/ejb/MyTest?? What is env/ejb?? Is that supposed to correspond to something we have put in one of the different xml files? Or is it part of the package com.test.ejb ? MyTest is probably the name of the remote interface. But why the name of the remote interface, why not the name of the home interface? Or is MyTest refering to somwthing in the XML-files?

Now I am going to have a look at <http://cwiki.apache.org/GMOxDOC11/deployment-plans-level-1.html>http://cwiki.apache.org/GMOxDOC11/deployment-plans-level-1.html and see if that can put me on the right track. But I am looking forward to your response Lasantha!

Best regards // Mattias



At 09:06 2006-09-13, you wrote:
Hi Mattias,

Following are my comments regarding this sample. I think step 1 to 3 you might have already done. Anyway I am going to put it to clarity.

1. web.xml
You need to add ejb-ref element to the given web.xml as given in below. Missing geronimo-web.xml in will give a warning. But anyway it will work. :)

<?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>
<display-name>MyTestServlet</display-name>
<servlet-name>MyTestServlet</servlet-name>
<servlet-class>MyTestServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>MyTestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>

<ejb-ref>
<ejb-ref-name>ejb/MyTest</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>MyTestHome</home>
<remote>MyTest</remote>
<ejb-link>MyTestBean</ejb-link>
</ejb-ref>

</web-app>

2. Can't find openejb-jar.xml and ejb-jar.xml in your document.
I can't find the openejb-jar.xml and ejb-jar.xml for the ejb.jar file. It would be some thing like this given in the below.

openejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1";>
<dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1";>
<dep:moduleId>
<dep:groupId>samples</dep:groupId>
<dep:artifactId>my-test-ejb</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>car</dep:type>
</dep:moduleId>
<dep:dependencies/>
<dep:hidden-classes/>
<dep:non-overridable-classes/>
</dep:environment>
<enterprise-beans>
<session>
<ejb-name>MyTestBean</ejb-name>
<jndi-name>MyTestBean</jndi-name>
</session>
</enterprise-beans>
</openejb-jar>

ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar 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/ejb-jar_2_1.xsd"; version="2.1">

<display-name>Generated by XDoclet</display-name>

<enterprise-beans>

<!-- Session Beans -->
<session >
<description>Test EJB </description>
<ejb-name>MyTestBean</ejb-name>
<home>MyTestHome</home>
<remote>MyTest</remote>
<ejb-class>MyTestBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>

</enterprise-beans>

</ejb-jar>

3. Create JAR files.
Hope EJB jar file would have a package structure something similar here.
my-test-ejb.jar
|-META-INF/ openejb-jar.xml
|-META-INF/ ejb-jar.xml
|- <ejb classes>

4. Create an EAR with following structure. Note I have changed WAR archive as my-test-web.war. ;)
my-test.ear
|- META-INF/ application.xml
my-test-web.war
my-test-ejb.jar

application.xml

5. Refer EJB from Servlet as given below. (Casting to PortableRemoteObject is unnecessary. Anyway I am leaving it as you given)

MyTestServlet.java

import java.io.IOException;
import java.io.PrintWriter;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.test.ejb.MyTest;
import com.test.ejb.MyTestHome;


public class MyTestServlet extends HttpServlet {


public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter();
out.println("This is a test, time in servlet =" + new java.util.Date().toString() + "<p>");
// Put the code here that can get the time from the EJB
// That code might look somthing like this?

try {
Context initial = new InitialContext();
Object objref = initial.lookup("java:comp/env/ejb/MyTest");
MyTestHome home = (MyTestHome)PortableRemoteObject.narrow(objref, MyTestHome.class);

MyTest test = home.create();
String newtime = test.getTime();
out.println("This is a new test, time from EJB =" + newtime + "<p>");
} catch (Exception e) {
e.printStackTrace();
out.println("Faild to get time from EJB<p>");
}
}
}

Hope this will help.

BR,
Lasantha Ranaweera

Mattias Malmgren wrote:
Hi!

I have prepared something for you here:

http://www.freefarm.se/geronimohelp.htm

Best regards / Mattias


At 15:01 2006-09-12, you wrote:
Hi Mattias,

I would like to help you on this matter. Post your files to the community.

Regards,
Lasantha Ranaweera

Mattias Malmgren wrote:
Hello!

I have coded Java for 10 years, I know who to write Servlets and so on. Now I would like to write som EJBs and depoy them on geronimo. I can compile my EJBs, but the hard task is to make a ear-file and deploy. I have looked at the Bank-exemaple in the documentation, but it is to compex. Is there a more minimalistic example?

Best regards / Mattias





Reply via email to