V1.0 - 13/01/2004 - original
V1.1 - 31/01/2004 - forbedret formatering
V1.2 - 14/02/2010 - smårettelser
Vigtig note
Indholdet i denne artikel er forældet i forhold til EJB 3.0 og 3.1.
(iøvrigt fordi de har bygget features meget lig med XDoclet ind i
selve EJB via Java 1.5+ annotations)
Den er kun relevant hvis man arbejder med EJB 1.1, 2.0 og 2.1.
Baggrund
Man har ikke arbejdet længe med EJB's førend man sidder og bruger
rigtigt meget tid på trivielt arbejde:
- vedligeholde standard deployment descriptorer
- vedligeholde home/remote/localhome/local interfaces
Heldigvis er der lavet et lille tool xdoclet som kan
hjælpe med det.
Brug
xdoclet kan hentes her:
http://xdoclet.sourceforge.net/
Installation er bare unzip.
Man skal have ant installeret.
Mit eksempel er med JBoss applikations server, men XDoclet
understøtter dem alle fra IBM WebSphere og BEA WebLogic og nedad.
Ideen i xdoclet er meget simpel: man skriver nogle specielle
kommentarer i selve bean implementationen (ligesom java doc
kommentarer) og så genererer xdoclet alt det trivielle.
Jeg vil lave en meget simpel session bean (stateless, CMT) og
en simpel entity bean (CMP 2.0).
TestSessionBean.java
package test;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
/**
* TestSessionBean.
*
* @ejb.bean
* name="TestSession"
* type="Stateless"
* jndi-name="ejb/TestSession"
* local-jndi-name="ejb/LocalTestSession"
*/
public class TestSessionBean implements SessionBean {
private SessionContext sessionContext;
public void ejbCreate() {
return;
}
public void ejbRemove() {
return;
}
public void ejbActivate() {
return;
}
public void ejbPassivate() {
return;
}
public void setSessionContext(SessionContext sessionContext) {
this.sessionContext = sessionContext;
}
/**
* String dup.
*
* @ejb.interface-method
* view-type="both"
*/
public String dup(String s) {
return (s + s);
}
}
TestEntityBean.java
package test;
import javax.ejb.*;
/**
* TestEntityBean.
*
* @ejb.bean
* name="TestEntity"
* type="CMP"
* cmp-version="2.x"
* jndi-name="ejb/TestEntity"
* local-jndi-name="ejb/LocalTestEntity"
* primkey-field="f1"
*
* @ejb.finder
* signature="java.util.Collection findAll()"
*
* @ejb.persistence
* table-name="T1"
*
* @jboss.persistence
* datasource="java:/TestMSAccess"
* datasource-mapping="SOLID"
*/
abstract public class TestEntityBean implements EntityBean {
private EntityContext entityContext;
public Integer ejbCreate(Integer f1, String f2) throws CreateException {
setF1(f1);
setF2(f2);
return null;
}
public void ejbPostCreate(Integer f1, String f2) throws CreateException {
}
public void ejbRemove() throws RemoveException {
}
public void ejbLoad() {
}
public void ejbStore() {
}
public void ejbActivate() {
}
public void ejbPassivate() {
}
public void unsetEntityContext() {
this.entityContext = null;
}
public void setEntityContext(EntityContext entityContext) {
this.entityContext = entityContext;
}
/**
* @ejb.persistence
* column-name = "F1"
*
* @ejb.pk-field
*
* @ejb.interface-method
* view-type="both"
*/
public abstract Integer getF1();
/**
* @ejb.interface-method
* view-type="both"
*/
public abstract void setF1(Integer f1);
/**
* @ejb.persistence
* column-name = "F2"
*
* @ejb.interface-method
* view-type="both"
*/
public abstract String getF2();
/**
* @ejb.interface-method
* view-type="both"
*/
public abstract void setF2(String f2);
}
Og med det følgende i build.xml så kan ant generere det hele:
<path id="xdoclet.libs">
<fileset dir="/xdoclet-1.2/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="gen">
<taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask" classpathref="xdoclet.libs"/>
<ejbdoclet destDir="${dd}" ejbspec="2.0">
<fileset dir="${ejbsrc}">
<include name="**/*Bean.java"/>
</fileset>
<homeinterface destDir="${gensrc}"/>
<localhomeinterface destDir="${gensrc}"/>
<remoteinterface destDir="${gensrc}"/>
<localinterface destDir="${gensrc}"/>
<deploymentdescriptor destdir="${dd}"/>
<jboss version="3.2" destdir="${dd}"/>
</ejbdoclet>
</target>
<target name="build" depends="gen">
<javac srcdir="${ejbsrc};${gensrc}" destdir="${bin}"/>
<jar jarfile="${ejbjarname}">
<fileset dir="${bin}"/>
<metainf dir="${dd}"/>
</jar>
</target>
Den genererer følgende deployment descriptorer:
ejb-jar.xml
jboss.xml
jbosscmp-jdbc.xml
Den genererer følgende interfaces:
TestEntity.java
TestEntityHome.java
TestEntityLocal.java
TestEntityLocalHome.java
TestSession.java
TestSessionHome.java
TestSessionLocal.java
TestSessionLocalHome.java
(ingen grund til at kopiere dem ind i artiklen)
Man kan sagtens lade den generere deployment descriptorer til flere
forskellige applikation servere.


