Hallo, ich möchte in einem Servlet eine EJB integrieren. Die EJB habe ich wie folgt geschrieben:
Ich lege oben in den xdoclet-tags fest, dass ein Name für das Remote und Local -Inerface vergeben werden sollen.
Diese EJB verwende ich nun in einem Servlet
Wie schon erwähnt verwende ich für die Generierung der Hilfsklassen und Interfaces xdoclet-1.2.3. dazu habe ich in der build.xml folgendes target festgelegt
Zum Schluss habe ich auch in der build.properties die bibliotheken für xdoclet angegeben:
wenn ich nun im Projektordner den Befehl ant ausführe, erhalte ich die Fehlermeldung im Terminal:
Meine Frage ist, was ist an meinen xdoclet-Konfigurationen falsch, dass anscheinend die Interface-Klassen der FacadeSessionBean EJB nicht erzeugt werden?
Code:
package de.bsd.adb.ejb;
import java.util.ArrayList;
import java.util.Iterator;
import javax.ejb.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import de.bsd.adb.beans.*;
import java.util.Collection;
/**
*
*
* @ejb.bean name="Facade"
* type="Stateless"
* view-type="both"
* jndi-name="adb/Facade"
* local-jndi-name="adb/FacadeLocal"
*/
public abstract class FacadeSessionBean implements SessionBean {
public void ejbCreate() throws CreateException{
...
}
/**
* @ejb.interface-method
*/
public AddrBean add(AddrBean a){
...
}
/**
* @ejb.interface-method
*/
public AddrBean[] suche(String name, String vorname){
...
}
}
Ich lege oben in den xdoclet-tags fest, dass ein Name für das Remote und Local -Inerface vergeben werden sollen.
Diese EJB verwende ich nun in einem Servlet
Code:
package de.bsd.adb.servlets;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import de.bsd.adb.beans.*;
import de.bsd.adb.ejb.*;
import java.util.ArrayList;
import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpSession;
public class WorkServlet extends HttpServlet{
private FacadeHome fh;
private Facade fa;
public void init() throws ServletException{
try{
InitialContext ic = new InitialContext();
Object o = ic.lookup("adb/Facade");
fh = (FacadeHome) o;
}catch (NamingException e){
fh = null;
throw new ServletException(e);
}
}
protected void doPost (HttpServletRequest req, HttpServletResponse resp) {
...
}
private AddrBean[] handleSearch(HttpServletRequest req){
...
}
private AddrBean[] handleAdd(HttpServletRequest req){
...
Facade fa = fh.create();
fa.add(a);
fa.remove();
...
}
}
Wie schon erwähnt verwende ich für die Generierung der Hilfsklassen und Interfaces xdoclet-1.2.3. dazu habe ich in der build.xml folgendes target festgelegt
Code:
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." name="adb" default="Testserver">
<!-- Voreinstellungen lesen -->
<property file="build.properties"/>
<target name="Testserver" depends="war"/>
<target name="deploy-war" description="adb.war auf dem Server einspielen">
<copy overwrite="true" file="${build.dir}/adb.war" todir="${jboss.deploy.dir}"/>
</target>
<target name="compile-web" description="Servlet übersetzen">
<mkdir dir="${gen-class.dir}"/>
<javac classpath="${servlet.lib.path}"
classpathref="server.path.ref"
debug="on"
destdir="${gen-class.dir}"
srcdir="${src.dir}"
includes="de/bsd/adb/servlets/*.java, de/bsd/adb/beans/*.java,de/bsd/adb/ejb/*.java"/>
</target>
<target name="war" depends="compile-web" description="adb.war zusammenbauen">
<war destfile="${build.dir}/adb.war" webxml="web.xml">
<classes dir="${gen-class.dir}">
<include name="**/servlets/*.class"/>
<include name="**/beans/*.class"/>
<include name="**/ejb/Facade.class"/>
<include name="**/ejb/FacadeHome.class"/>
</classes>
<fileset dir="${src.dir}/de/bsd/adb/web">
<include name="*.jsp"/>
<include name="*.html"/>
<include name="prot/*.jsp"/>
</fileset>
</war>
</target>
<path id="xdoclet.path.ref">
<!--xdoclet libs-->
<fileset dir="${xdoclet.lib.path}">
<include name="*.jar"/>
</fileset>
<!--jboss/j2ee libs-->
<fileset dir="${jboss.client.di}">
<include name="jboss-j2ee.jar"/>
</fileset>
</path>
<path id="server.path.ref">
<pathelement location="${build.dir}/adb-ejb.jar"/>
<pathelement location="${jboss.client.dir}/jboss-j2ee.jar"/>
</path>
<target name="init">
<taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask"
classpathref="xdoclet.path.ref"/>
<mkdir dir="build"/>
<mkdir dir="build/gen-classes"/>
<mkdir dir="build/META-INF"/>
</target>
<target name="ejbdoclet" depends="init" description="Hilfsklassen für EJBs erzeugen">
<ejbdoclet destdir="${gen-src.dir}" ejbspec="2.1">
<fileset dir="${src.dir}">
<include name="de/bsd/adb/ejb/*.java"/>
</fileset>
<localinterface/>
<localhomeinterface/>
<remoteinterface/>
<homeinterface/>
<entitypk/>
<entitycmp/>
<session/>
<deploymentdescriptor destdir="${build.dir}/META-INF" validatexml="true"/>
<jboss destdir="${build.dir}/META-INF" version="4.0"/>
</ejbdoclet>
</target>
<target name="compile-ejb" description="EJBs übersetzen" depends="ejbdoclet">
<mkdir dir="${gen-Class.dir}"/>
<javac classpath="${j2ee.lib}"
debug="on"
destdir="${gen-Class.dir}"
includes="de/bsd/adb/ejb/*.java, de/bsd/adb/beans/*.java">
<src path="${src.dir}"/>
<src path="{gen-src.dir}"/>
</javac>
</target>
<target name="jar" description="build adb-ejb.jar" depends="compile-ejb">
<jar destfile="${build.dir}/adb-ejb.jar">
<fileset dir="${gen-class.dir}">
<include name="de/bsd/adb/ejb/*.class"/>
<include name="de/bsd/adb/beans/*.class"/>
</fileset>
<metainf dir="${build.dir}/META-INF"/>
</jar>
</target>
<target name="ear" description="Baut adb-app" depends="war,jar">
<ear destfile="${build.dir}/adb-app" appxml="application.xml">
<fileset dir="${build.dir}" includes="*.jar,*.war"/>
</ear>
</target>
</project>
Zum Schluss habe ich auch in der build.properties die bibliotheken für xdoclet angegeben:
Code:
#Ort der Quellen
src.dir=srcs
#Ort der erzeugten Quellen
gen-src.dir=gen-src
#Wo wird die Applilation zusammengebaut
build.dir=build
#Wo werden generierte Klassen abgelegt?
gen-Class.dir=${build.dir}/gen-classes
#Basisverzeichnis JBoss Server
jboss.dir = /Applications/jboss5.1
#Welcher Server soll gewählt werden
jboss.server=Testserver
#Der Pfad zum Server
jboss.server.dir=${jboss.dir}/server/${jboss.server}
#Wo ist javax.servlet.jar?
servlet.lib.path=${jboss.server.dir}/lib/javax.servlet.jar
#Wohin wird deployt?
jboss.deploy.dir=${jboss.server.dir}/deploy/
#Wo sind die xdoclet-bibliotheken?
xdoclet.lib.path=/Application/xdoclet-1.2.3/target/lib
#Wo sind die jboss-client-bibliotheken
jboss.client.dir=${jboss.dir}/client
#Wo ist der Ort für die javax.ejb.* Bibliotheken ?
j2ee.lib=${jboss.client.dir}/jboss-j2ee.jar
#sollen die Tabellen vom Server beim Deploy angelegt werden?
create.table=true
#Sollen die Tabellen vom Server beim Undeploy gelöscht werden?
remove.table=true
wenn ich nun im Projektordner den Befehl ant ausführe, erhalte ich die Fehlermeldung im Terminal:
Code:
compile-web:
Compiling 1 source file to /Documents/workspace/adbTestprojekt/adb/${gen-class.dir}
/Documents/workspace/adbTestprojekt/adb/srcs/de/bsd/adb/servlets/WorkerServlet.java:21: cannot find symbol
symbol : class FacadeHome
location: class de.bsd.adb.servlets.WorkerServlet
private FacadeHome fh;
^
/Documents/workspace/adbTestprojekt/adb/srcs/de/bsd/adb/servlets/WorkerServlet.java:22: cannot find symbol
symbol : class Facade
location: class de.bsd.adb.servlets.WorkerServlet
private Facade fa;
^
/Documents/workspace/adbTestprojekt/adb/srcs/de/bsd/adb/servlets/WorkerServlet.java:28: cannot find symbol
symbol : class FacadeHome
location: class de.bsd.adb.servlets.WorkerServlet
fh = (FacadeHome) o;
^
/Documents/workspace/adbTestprojekt/adb/srcs/de/bsd/adb/servlets/WorkerServlet.java:71: cannot find symbol
symbol : class Facade
location: class de.bsd.adb.servlets.WorkerServlet
Facade fa = fh.create();
^
/Documents/workspace/adbTestprojekt/adb/srcs/de/bsd/adb/servlets/WorkerServlet.java:100: cannot find symbol
symbol : class Facade
location: class de.bsd.adb.servlets.WorkerServlet
Facade fa = fh.create();
^
Note: db/servlets/WorkerServlet.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
5 errors
BUILD FAILED
Meine Frage ist, was ist an meinen xdoclet-Konfigurationen falsch, dass anscheinend die Interface-Klassen der FacadeSessionBean EJB nicht erzeugt werden?
Zuletzt bearbeitet: