JBoss JEE Server

Introductie

JBoss is een veelgebruikt JEE applicatieserver en middleware omgeving, verkrijgbaar in een open source (JBoss Community) en in een commerciële variant (JBoss Enterprise). Het product wordt geleverd door Linux leverancier RedHat, via de website www.jboss.org en www.redhat.com.

Feitelijk is JBoss veel meer dan een JEE applicatieserver. Zo vinden we in de JBoss Enterprise productsuite ondermeer de JBoss Developer Studio, en producten zoals Enterprise Portal, Enterprise BRMS (business rule engine), Enterprise SOA Platform , Enterprise Application Platform (EAP). JBoss Developer Studio is een Eclipse gebaseerde ontwikkelomgeving met een groot aantal Eclipse plugins. Enterprise Application Platform (EAP) is een suite gebaseerd op de JBoss AS, uitgebreid met diverse aanvullende componenten. (Qua release aanduiding een beetje verwarrend, zo bevat EAP 6 bijv. JBoss AS 7).

Nauw verwant met JBoss is het open source product Hibernate, een object-relational mapping framework en tevens een JPA implementatie, verkrijgbaar via www.hibernate.org (of via jboss.org, onder projecten, project Hibernate).

JBoss AS7 is een JEE6 gecertificeerde applicatieserver en heeft qua architectuur opzet een wijziging ondergaan t.o.v. voorgaande releases 6 en eerder. Waar in de releases 6 en eerder de verschillende benodigde .jar libraries en resources eenvoudig in een /lib subdirectory konden worden geplaatst, worden deze nu in een directory structuur onder “/modules/..” geplaatst met aanvullend benodigde xml configuratie bestanden.

Installatie

Installatie Windows

De JBoss server wordt gedownload via de www.jboss.org website. Ga onder projecten, naar het JBoss Application Server 7 project. Daar worden behalve de laatste versie, ook de voorgaande versies beschikbaar gesteld. nDownload bijv. jboss-as-7.1.1.Final.zip.
(directe url: http://www.jboss.org/jbossas/downloads).

De zip wordt uitgepakt en ergens op de schijf geïnstalleerd, bijv
C:/Tools/Java/jboss-as-7.1.1.Final.

Een JBoss server kan als losse server worden gestart met het script

[JBoss Home]\bin\standalone.bat

De server wordt weer gestopt met “ctrl-C” in de terminal. Of maak gebruik van

[JBoss Home]\bin\shutdown.bat

JBoss Servers kunnen ook als groep worden geconfigureerd. Daarvoor moet een domain controller worden geconfigureerd, en elke losse server als onderdeel van een domain worden geconfigureerd.

De server is bereikbaar via de browser http://localhost:8080

De default JBoss management console is http://localhost:9990/console
Om deze te kunnen openen moet er een administratieve user zijn geconfigureerd.
Dat doe je met add-user.bat in de /bin directory (bijv. admin/secret).

Installatie JBossAS7 als Windows Service

JBoss server kan als windows service worden geïnstalleerd. Voor dit doel hebben JBoss AS6 en eerder het service.bat script bestand. Maar voor JBossAS7 is dat minder eenvoudig en wordt niet standaard gedocumenteerd. Om dit te kunnen doen moet de JBoss Native Connector component separaat worden gedownload. JBoss Native Connector is een onderdeel van JBoss Web : een TomCat gebaseerde webserver + Servlet/JSP container, en tevens onderdeel van JBoss AS.

Ga onder projecten, naar het JBoss Web project, en vervolgens naar JBoss Web Native en download de meest recente versie, bijv. jboss-native-2.0.10-windows-x64-ssl.zip.
Pak deze uit in de JBoss AS7 installatie root. De Web Native connector heeft in de bin directory de service.bat file. Hierin moeten een aantal aanpassingen worden doorgevoerd:

  • Wijzig eventueel de variabelen “SVCNAME”, “SVCDISP” en “SVCDESC” naar zinvolle namen.
  • Pas de JAVA_OPTS aan naar hogere benodigde memory hoeveelheid. Behoud wel de -Xrs instelling. Bijv: set JAVA_OPTS=-Xrs -Xms1024M -Xmx1024M
  • Voeg een JAVA_HOME toe naar de actuele JDK als deze niet is ingesteld als environment variabele.
  • Wijzig alle run.bat calls naar standalone.bat calls.
  • Alle “call shutdown” calls uit commentariëren en vervangen door
    “call jboss-cli.bat –connect command=:shutdown >> shutdown.log 2>&1”.

Installeer met commando:
service.bat install 

Server Configuratie en Administratie

User administratie

Met het script [JBoss Home]\bin\add-user.bat kunnen users worden toegevoegd.
Er kan een keuze worden gemaakt tussen Management en Application Users.
Deze users worden toegevoegd in resp. de bestanden

[JBoss Home]\standalone\configuration\mgmt-users.properties
[JBoss Home]\standalone\configuration\application-users.properties

Host & Port configuratie

Configuratie van o.a. host en poortnummers vindt plaats via het xml bestand :


[JBoss Home]\standalone\configuration\standalone.xml

Hierin bevindt zich de sectie met o.a. poortnummers voor http, https, en admin console:

    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9443}"/>
        <socket-binding name="ajp" port="8009"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8443"/>
        <socket-binding name="osgi-http" interface="management" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>

Eclipse Gebruik

JBoss Eclipse Tools Installatie

De JBoss Eclipse tools maken gebruik van Maven en daarvoor is installatie van de Eclipse
Maven plugin M2E van belang (http://download.eclipse.org/technology/m2e/releases).

JBoss plugins kunnen aan Eclipse worden toegevoegd via de standaard Eclipse software Sites of via de Eclipse Marketplace (Menu Help -> Eclipse Marketplace).
Via de Software Sites kan selectiever te werk worden gegaan welke onderdelen wel of niet te installeren. Aangezien JBoss erg omvangrijk is, en niet altijd alles nodig zal zijn, kan het beste met Software Sites worden gewerkt.

Software Sites:
Voeg de volgende url toe via menu “Window -> Preferences”, categorie “Install/Update -> Available Software Sites” :

http://download.jboss.org/jbosstools/updates/development/indigo/


“indigo” kan worden vervangen door de actuele gebruikte Eclipse versie, bijv. juno.
Er zijn erg veel JBoss componenten beschikbaar. Er kan worden begonnen met alleen de JBossAS Tools en eventueel Hibernate tools.

Eclipse Marketplace
Selecteer menu “Help -> Eclipse Marketplace” en voer in zoekveld “JBoss” in.
Hier worden JBoss Developer Studio en JBoss Tools als optie gepresenteerd voor de verschillende Eclipse releases zoals Juno, Indigo en Helios.

Starten van een Maven JBoss Project

Een nieuw project wordt gestart met Maven. Als archetype kan gebruik worden gemaakt van bijv:

  • jboss-javaee6-webapp-archtype : war project met voorbeeld code
  • jboss-javaee6-webapp-blank-archetype : war project zonder voorbeeld code
  • jboss-javaee6-webapp-ear-archetype : ear project met voorbeeld code
  • jboss-javaee6-webapp-ear-blank-archetype : ear project zonder voorbeeld code

Bij gebruik van jboss-javaee6-webapp-blank-archetype worden de volgende elementen gemaakt:

  • De standaard Maven projectstructuur en bijbehorende pom.xml
  • Onder /src/main/resources/META-INF een initiele persistence.xml voor gebruik met een H2 in-memory database. Deze moet waar nodig worden aangepast aan de actueel te gebruiken database resources.
  • Onder src/main/webapp/WEB-INF:
    • De initiele beans.xml die nodig is voor initiatie van het CDI mechanisme
    • De initiele faces-config voor JSF toepassing. Deze is niet nodig als geen JSF wordt gebruikt
    • Een deployment bestand [projectnaam]-ds.xml met de definitie voor een H2 in-memory database. Deze is niet nodig als H2 niet wordt gebruikt.
  • Onder src/test/resources:
    • Een arquillian.xml bestand voor het Arquillian integration test product. Deze is niet nodig als Arquillian niet wordt gebruikt.
    • Een test-ds.xml met de definitie voor een H2 in-memory database. Deze is niet nodig als H2 niet wordt gebruikt.

Warnings “Encountered invalid class name” wordt voorkomen door toevoegen van :

<dependency>
    <groupId>org.jboss.shrinkwrap</groupId>
    <artifactId>shrinkwrap-api</artifactId>
</dependency>
<dependency>
    <groupId>org.jboss.shrinkwrap</groupId>
    <artifactId>shrinkwrap-impl-base</artifactId>
    <scope>test</scope>
</dependency>

Security

JBoss ondersteunt standaard JAAS security. Java Authentication and Authorization Service voorziet in authorisatie en authenticatie. Zie ook het algemene artikel JAAS over dit onderwerp. Om gebruik te maken van de basic authentication mogelijkheden moet dit voor JBoss worden geconfigureerd. Er kan gebruik worden gemaakt van de standaard JBoss login module en de database login module.

Standaard JBoss Login module

Om gebruik te maken van de standaard login faciliteit van JBoss is in standalone.xml de volgende Realm gedefinieerd:

<subsystem xmlns="urn:jboss:domain:security:1.1">
   <security-domains>
      <security-domain name="other" cache-type="default">
         <authentication>
            <login-module code="RealmUsersRoles" flag="required">
               <module-option name="usersProperties"
                              value="${jboss.server.config.dir}/application-users.properties"/>
               <module-option name="rolesProperties"
                              value="${jboss.server.config.dir}/application-roles.properties"/>
               <module-option name="realm" value="ApplicationRealm"/>
               <module-option name="password-stacking" value="useFirstPass"/>
           </login-module>
         </authentication>
       </security-domain>
    </security-domains>
</subsystem>

Deze Realm gebruikt het application-users.properties en application-roles.properties bestand in
[JBoss Home]\standalone\configuration\

Database Login Module

Om gebruik te maken van een custom database gebaseerde login faciliteit wordt in standalone.xml de volgende voorbeeld Realm “MyRealm” gedefinieerd:

<security-domain name="MyRealm">
   <authentication>
      <login-module code="Database" flag="required">
         <module-option name="dsJndiName" value="java:/employeedbh"/>
         <module-option name="principalsQuery" value="select password from user where userName=?"/>
         <module-option name="rolesQuery"
                        value="SELECT r.name, 'Roles' FROM user AS u, userrole AS ur, role AS r WHERE
                               ur.userId = u.userId AND ur.roleId = r.roleId AND u.userName = ?"/>
      </login-module>
   </authentication>
</security-domain>

De database met de tabellen user, role en userrole wordt gespecificeerd met de optie “dsJndiName” en heeft hier de waarde “java:/employeedbh” die verwijst naar de datasource definitie in het zelfde standalone.xml bestand.

Om de Realm “MyRealm” in te stellen voor een applicatie wordt in /WEB-INF naast de web.xml ook een bestand jboss-web.xml toegevoegd met de volgende inhoud:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <security-domain>java:/jaas/MyRealm</security-domain>
</jboss-web>

Op deze wijze kan bijv. voor verschillende omgevingen met verschillende database datasources, per omgeving een Realm worden gedefinieerd. Elke Realm verwijst naar zijn eigen datasource waarin de users en rollen zijn gedefinieerd.

NB: Als de custom login module gebruikt wordt voor programmatische login, dwz het gebruik maken van de login()/lougout() calls als nieuwe mogelijkheid vanaf Servlet3.0, dan moet er een security definitie worden toegevoegd in web.xml. Als dat niet aanwezig is zal de benodigde authenticator niet worden geactiveerd en ontstaat een foumelding “No authenticator available for programmatic login”. De volgende definitie in web.xml voorkomt dit:

  <security-constraint>
     <web-resource-collection>
        <web-resource-name>All resources</web-resource-name>
        <url-pattern>/dummy_url/*</url-pattern>
     </web-resource-collection>
  </security-constraint>
 

Email Configuratie

Configuratie van smtp email resources vindt plaats via het xml bestand :

[JBoss Home]\standalone\configuration\standalone.xml

De SMTP configuratie bevindt zich in de volgende sectie :

        <subsystem xmlns="urn:jboss:domain:mail:1.0">
            <mail-session jndi-name="java:jboss/mail/Default">
                <smtp-server outbound-socket-binding-ref="mail-smtp"/>
            </mail-session>
        </subsystem>

In de volgende sectie worden SMTP host en poortnummer gedefinieerd:

    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        …...
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>

GMail als SMTP Server

Onderstaande configuratie geeft aan hoe een persoonlijk GMail account als SMTP server kan worden geconfigureerd en gebruikt voor het testen van email functionaliteit.

<subsystem xmlns="urn:jboss:domain:mail:1.0">
            <mail-session jndi-name="java:jboss/mail/GMailSSL">
                <smtp-server ssl="true" outbound-socket-binding-ref="mail-smtp-GMailSSL">
                    <login name="your@gmail.com" password="mypassword"/>
                </smtp-server>
            </mail-session>
            <mail-session jndi-name="java:jboss/mail/GMailTLS">
                <smtp-server outbound-socket-binding-ref="mail-smtp-GMailTLS">
                    <login name="your@gmail.com" password="mypassword"/>
                </smtp-server>
            </mail-session>
</subsystem>

De “java:jboss/….” conventie voor de JNDI naamgeving lijkt hier noodzakelijk te zijn.
De mail resource wordt als volgt gebruikt in een Java email toepassing:

    @Resource(mappedName = "java:jboss/mail/GMailSSL")
    private Session sessionSSL;

Hier is het gebruik van het attribuut “mappedName” van belang.

(In een OpenEjb omgeving kan het attribuut “name” worden gebruikt en is de “java:/” JNDI conventie niet noodzakelijk).

Hieronder een Java praktijkvoorbeeld van het gebruik van de mail configuratie:

@Stateless
@LocalBean
public class EmailSessionBean {

    @Resource(mappedName = "java:jboss/mail/GMailSSL")
    private Session sessionSSL;

	public boolean sendEmailSSL(String to, String subject, String body) {

	    try {
            MimeMessage m = new MimeMessage(sessionSSL);
            Address from = new InternetAddress("sender@gmail.com");
            Address[] tolist = new InternetAddress[] {new InternetAddress(to) };

            m.setFrom(from);
            m.setRecipients(Message.RecipientType.TO, tolist);
            m.setSubject(subject);
            m.setSentDate(new java.util.Date());
            m.setContent(body,"text/plain");
            System.out.println("Send email");
            Transport.send(m);
	        System.out.println("email sent");
	        return true;
	      } catch (MessagingException ex) {
	        ex.printStackTrace();
	        return false;
	      }
    }
}

En nog een voorbeeld, nu met gebruik van HTML opmaak in het email bericht:

	public boolean sendEmailSSL_HTML(String to, String subject, String body) {
	    try {
	            String fromAddress = "sender@gmail.com";
	            Message message  =   new MimeMessage(sessionSSL);
	            message.setFrom(new InternetAddress(fromAddress));
	            message.setRecipient(RecipientType.TO, new InternetAddress(to));
	            message.setSubject(subject);

	            Multipart multipart = new MimeMultipart("alternative");

				MimeBodyPart textPart = new MimeBodyPart();
				textPart.setText(body + "(textcontent)");

				MimeBodyPart htmlPart = new MimeBodyPart();
				String htmlContent = "<html><h1>Hi</h1><p>" +  body +
                                             "(htmlcontent)" + "</p></html>";
				htmlPart.setContent(htmlContent, "text/html");

				multipart.addBodyPart(textPart);
				multipart.addBodyPart(htmlPart);
				message.setContent(multipart);

	            System.out.println("Send email");
	            Transport.send(message);
	            System.out.println("email sent");
	            return true;
	      } catch (MessagingException ex) {
	            ex.printStackTrace();
	            return false;
	      }
    }

Database configuratie

In de JBoss Home directory bevindt zich de modules directory. Hierin worden ondermeer de database drivers gedefinieerd. Standaard heeft de JBoss installatie een H2 “in-memory” database driver gedefinieerd. Deze is te zien in de directory modules\com\h2database\h2\main.
De database resource worden toegevoegd in het bestand :

[JBoss Home]\standalone\configuration\standalone.xml

In de sectie “datasources” worden de database resource definities toegevoegd.

MySQL

De MySQL database wordt toegevoegd als modules\com\mysql\main. In deze directory wordt de jdbc driver geplaatst, bijv. : mysql-connector-java-5.1.12-bin.jar Aanvullend wordt hier een module.xml file toegevoegd met de volgende inhoud:

<module xmlns="urn:jboss:module:1.0" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.1.12-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
  </dependencies>
</module>

De MySQL database resource definities worden toegevoegd in het bestand standalone.xml in de sectie. Zie onderstaand voorbeeld waarin de database “employeedb” met JNDI name “java:/employeedb” wordt gedefinieerd.

<datasources>
<datasource jndi-name="java:/employeedb" pool-name="employeedb">
                    <connection-url>jdbc:mysql://localhost:3306/employeedb</connection-url>
                    <driver>com.mysql</driver>
                    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
                    <pool>
                        <min-pool-size>10</min-pool-size>
                        <max-pool-size>100</max-pool-size>
                        <prefill>true</prefill>
                    </pool>
                    <security>
                        <user-name>root</user-name>
                        <password>mypassword</password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>32</prepared-statement-cache-size>
                        <share-prepared-statements>true</share-prepared-statements>
                    </statement>
</datasource>
<drivers>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                    <driver name="com.mysql" module="com.mysql">
                        <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
                    </driver>
</drivers>
</datasources>

HSQLDB

De HSQLDB database wordt toegevoegd als modules\org\hsqldb\main. In deze directory wordt de jdbc driver geplaatst, bijv. : mysql hsqldb-2.2.8.jar. Aanvullend wordt hier een module.xml file toegevoegd met de volgende inhoud:

<module xmlns="urn:jboss:module:1.0" name="org.hsqldb">
  <resources>
    <resource-root path="hsqldb-2.2.8.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
	<module name="javax.transaction.api"/>
  </dependencies>
</module>

De HSQLDB database resource definities worden toegevoegd in het bestand standalone.xml in de sectie “datasources”. Zie onderstaand voorbeeld waarin de database “employeedbh” met JNDI name “java:/employeedbh” wordt gedefinieerd.

<datasource jndi-name="java:/employeedbh" pool-name="employeedbh" enabled="true" jta="true" use-java-context="true">
                    <connection-url>jdbc:hsqldb:mem:employeedb</connection-url>
                    <driver>hsqldb</driver>
                    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
                    <security>
                        <user-name>sa</user-name>
                        <password></password>
                    </security>
</datasource>

Hibernate en JPA

persistence.xml configuratie

In JBoss wordt de JEE / JPA standaard geïmplementeerd met Hibernate. Hibernate kan zowel native als met de JPA api worden gebruikt. Voor JPA wordt gebruik gemaakt van het persistence.xml bestand in plaats van het Hibernate specifieke bestand hibernate.cfg.xml.
De locatie van dit bestand is de META-INF sub-directory. In een Maven project zit deze in src/main/resources/META-INF.

Zie onderstaand voorbeeld van een persistence.xml configuratie. Hierin de naam van de persistence unit (in dit voorbeeld “MyPU” en de JNDI naam van de database “java:/employeedb” die is gedefinieerd in het bestand

[JBoss Home]\standalone\configuration\standalone.xml.

De property hibernate.hbm2ddl.auto met value=”create-drop” zorgt er voor dat de database elke keer opnieuw wordt geleegd en gemaakt. Een andere optie is value=”update”, waarmee de tabellen alleen worden gemaakt als ze er niet zijn.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="htp://java.sun.com/xml/ns/persistence" xlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="

http://java.sun.com/xml/ns/persistence


http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

   <persistence-unit name="MyPU">
      <jta-data-source>java:/employeedb</jta-data-source>
      <class>org.biz.entities.Department</class>
	  <class>org.biz.entities.Employee</class>
	  <class>org.biz.entities.Role</class>
	  <class>org.biz.entities.User</class>
	  <class>org.biz.entities.UserRole</class>
      <properties>
         <property name="hibernate.hbm2ddl.auto" value="create-drop" />
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
         <property name="hibernate.show_sql" value="false" />
      </properties>
   </persistence-unit>
</persistence>

Gebruik van Entity Relations

De meeste relaties tussen JPA entities worden gevormd met de annotaties @ManyToOne en @OneToMany, bijv:

	//bi-directional many-to-one association to Department
	@ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
	@JoinColumn(name="DepartmentId")
	private Department department;

	//bi-directional many-to-one association to Employee
	@OneToMany(mappedBy="department",fetch = FetchType.EAGER,cascade =
CascadeType.ALL)
	private List<Employee> employees;

Een relatie tussen twee entities kan Lazy of Eager zijn. Bij Lazy worden gerelateerde Entities pas uit de database gelezen als deze nodig zijn. Bij Eager worden ze direct gelezen.
Bij grote verzamelingen kan Eager veel performance en geheugen gebruik kosten.
In bovenstaande voorbeelden is te zien hoe via het FetchType de relatie Lazy of Eager kan worden ingesteld.

@ManyToOne en @OneToOne relaties zijn default “Eager”.
@OneToMany en @ManyToMany relaties zijn default “Lazy”.

Hibernate is in vergelijking met OpenJPA kritischer wat betreft relaties tussen Entities.
Er kunnen 2 veel voorkomende problemen ontstaan:

  • Bij Lazy Loading zijn gerelateerde Entities niet meer beschikbaar.
  • Oneindige cyclus van bi-directionele referenties tussen Entities

Lazy Loading probleem:
Bij dit probleem komt de volgende foutmelding vaak voor:

failed to lazily initialize a collection………no session or session was closed

De bovenstaande foutmelding houdt in dat een relatie wordt benaderd terwijl de entity context niet meer aanwezig is. Dus de relatie is niet meer bereikbaar.

Oneindige cyclische relaties:
Een ander type foutmelding gaat over oneindige cyclische relaties tussen entities.
Dat komt voor als een relatie tussen 2 entities bi-directioneel wordt gemodelleerd. In dat geval zal een Parent Entity via een @OneToMany naar een verzameling Child Entities verwijzen. Als de uit de database gelezen Child Entities via de @ManyToOne weer naar de parent Entities verwijzen, zullen die vervolgens weer naar de Child Entities verwijzen, en dat blijft zo doorgaan.

Het verdient aanbeveling om voorzichtig te zijn met bi-directionele relaties.
Belangrijkste zijn altijd de @ManyToOne relaties, want die vormen de foreign key relatie die in de Database noodzakelijk is om een relatie tussen entities te vormen.
De andere relaties worden gebruikt om navigatie van parent naar child mogelijk te maken.

SOAP Webservices

Een SOAP webservice kan met JEE annotatie @WebService heel eenvoudig op basis van een EJB sessionbean worden gemaakt

@Stateless
@WebService(
        portName = "DepartmentPort",
        serviceName = "DepartmentServiceWS",
        targetNamespace = "http://biz.org/wsdl",
        endpointInterface = "org.biz.employeesSOAP.ws.DepartmentService")
public class DepartmentServiceWS implements DepartmentService {
}

Default wordt de url opgebouwd uit de projectnaam als contextroot en servicenaam:

http://localhost:8080/[project]/[servicenaam]/[servicenaam].wsdl


Dus bijv voor bovenstaande webservice :

http://localhost:8080/myproject/DepartmentServiceWS/DepartmentServiceWS.wsdl

Om een eigen url pad te specificeren moet in JBoss 7 gebruik worden gemaakt van een nieuw configuratiebestand “jboss-webservices.xml” welke geplaatst moet worden in /META-INF.

Hieronder een voorbeeld van dit bestand:

<?xml version="1.0" encoding="UTF-8"?>
<webservices version="1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.jboss.com/xml/ns/javaee"
       xsi:schemalocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss_webservices_1_0.xsd">
  <context-root>mycontext/webservices</context-root>
  <port-component>
    <ejb-name>DepartmentServiceWS</ejb-name>
    <port-component-uri>DepartmentServiceWS</port-component-uri>
  </port-component>
</webservices>

In dit voorbeeld krijgen we de volgende url:

http://localhost:8080/mycontext/webservices/DepartmentServiceWS.wsdl

NB: het bestand moet echt direct onder de webroot /META-INF worden geplaatst en niet bijv. onder de Maven /resources/META-INF.

REST Webservices

Een REST webservice kan met JEE annotaties @Path en @Post, @Get etc. heel eenvoudig op de standaard JEE wijze op basis van een EJB bean worden gemaakt:

@Singleton()
@Path("/dep")
@Produces({MediaType.APPLICATION_JSON})
public class DepartmentServiceImpl {

   @Path("/list")
   @Get
   public List<Department> list(	@QueryParam("first") @DefaultValue("0") int first,
    				@QueryParam("max") @DefaultValue("20") int max) {
   }
}

Bijzonderheid is wel de volgende class die aan het package met de REST classes toegevoegd moet worden om JAX-RS te activeren:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
public class JaxRsActivator extends Application {
   /* class body intentionally left blank */
}

De volgende Maven dependencies worden gebruikt voor JAX-RS en de EJB3 api :

        <!-- Import the JAX-RS API, we use provided scope as the API is included
            in JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.ws.rs</groupId>
            <artifactId>jboss-jaxrs-api_1.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the EJB API, we use provided scope as the API is included
            in JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.ejb</groupId>
            <artifactId>jboss-ejb-api_3.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>
This entry was posted in Java, JEE, JEE Servers and tagged . Bookmark the permalink.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd.

De volgende HTML tags en attributen zijn toegestaan: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>