Le TP est à rendre sous forme de projets zippés, incluant les sources commentés, les classes de test unitaires, les descriptions (sous forme de fichiers .txt) des tests fonctionnels + le(s) projet(s) SOAPUI le cas échéant. Le rendu est à faire sur spiral, avant le 2/12/2010 à 23h30 6/12/2010 à 8h00.
Notation:
Fonctionnalités | 10 pts |
Tests unitaires | 2 pts |
Tests fonctionnels | 2 pts |
Commentaires javadoc | 2 pts |
Commentaires de code | 1 pt |
Qualité et lisibilité du code | 1 pt |
Conception | 2 pts |
L'objectif de ce TP est d'implémenter le service de stockage de calendrier. On procédera d'abord en gérant à la main le message SOAP et en réutilisant le TP1, puis en utilisant dans une deuxième partie les mappings XML/Objet (via JAXB) et Objet/Relationnel (via JPA).
Extraire le projet storecalservice.zip.
Dans ce projet on créera une classe implémentant l'interface javax.xml.ws.Provider<javax.xml.transform.Source>
ou bien javax.xml.ws.Provider<javax.xml.soap.SOAPMessage>
. On annotera cette classe avec @WebServiceProvider
en précisant les paramètres nécessaires (voir la doc), ainsi qu'une annotation @ServiceMode, en indiquant PAYLOAD ou MESSAGE comme paramètre. En fonction du message reçu, on traitera la demande via la fonction invoke
, le résultat de l'invocation du service étant renvoyé par cette fonction.
Ne pas oublier d'ajouter la dépendance au TP1 dans maven pour pouvoir réutiliser vos classes de servant à stocker et récupérer un calendrier XML dans la BD relationnelle.
WebContent/WEB-INF/web.xml
une servlet dont la classe d'implémentation est la classe précédente. Ajouter également un “servlet mapping” pour lui attribuer une URL.WebContent/WEB-INF/web.xml
, ajouter une servlet metro utilisant la classe com.sun.xml.ws.transport.http.servlet.WSServlet
(avec un servlet mapping) et dans le fichier WebContent/WEB-INF/sun-jaxws.xml
spécifier un endpoint avec votre classe.web.xml
et créer le fichier services.xml
(voir ici).<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.2.4</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.2.4</version> </dependency>
Il existe des incompatibilités avec les APIs transformations (ou certaines implémentations de ces APIs). Dans tous les cas, préférer un
SAAJResult
à un DOMResult
Extraire le projet storecalserviceorm.zip.
Remarque: JPA est intégré dans JBoss. Pour l'utiliser avec Tomcat, il faut se procurer une implémentation, par exemple Hibernate. Les dépendances maven pour Hibernate sont disponibles ici.
Créer des classes pour représenter les calendriers, les composants et les propriétés. L'idée est d'utiliser JPA (turoriel) pour la sauvegarde des données.
Annoter ces classes avec les annotations de persistance JPA (package javax.persistence
), en particulier regarder @Entity
(définit une classe comme étant persistante), @Id
, @GeneratedValue
, @Column
, @ManyToOne
, @JoinColumn
, @OneToMany
, @ManyToMany
.
Lire la partie du tutoriel sur la gestion des entités et créer un fichier persistence.xml
. Définir également une source de données JNDI (voir ici) correspondant à celle déclarée dans persistence.xml
.
Exemple de fichier persistence.xml
avec deux unités de persistence:
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns: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_1_0.xsd"> <!-- Transactions gérées par le server d'application, par exemple JBoss --> <persistence-unit name="HotelServicesDAO"> <jta-data-source>java:comp/env/jdbc/HotelsDB</jta-data-source> </persistence-unit> <!-- Transactions gérées par l'application, par exemple dans une application indépendante ou pour des tests --> <persistence-unit name="HotelServicesDAOTest" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="validate" /> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> <property name="hibernate.connection.username" value="tomcat" /> <property name="hibernate.connection.password" value="tomcat" /> <property name="hibernate.connection.url" value="jdbc:mysql:///sw_hotels" /> <property name="hibernate.show_sql" value="false" /> </properties> </persistence-unit> </persistence>
Utiliser les générateurs de code pour générer des squelettes de classes à partir du WSDL:
.java
avec wsconsume
, puis implémenter l'interface correpondant au service.Ne pas hésiter à utiliser un plugin Maven pour la génération de code, par exemple le plugin jax-ws, ou en utilisant le plugin ant pour maven avec la tache ant correspondant à wsconsume (non testé).
Il peut être intéressant de séparer les sources générés des sources édités dans Netbeans en utilisant des répertoires sources distincts. Cela est généralement fait par défaut pour les plugins mavens (dans le répertoire target/generated-sources/xxxx
, reconnu automatiquement par Netbeans). Il peut également être intéressant de personnaliser les packages des classes générées. Alternativement, on peut ne générer les classes qu'une fois et ensuite les modifier (par exemple en ajoutant une couche JPA à certaines classes).
Enfin, éditer les fichiers de déploiement pour rendre le service disponible.