Etape 3 du tutorial : Création des objets métier et Exception JAX-WS
DiggIt!
Enregistrer sur Del.icio.us
Il s’agit de la 3ieme étape d’un tutorial sur la création de service web JAX-WS. Cette étape s’appuie sur le projet Eclipse créé précédemment (http://jl2tho.blogspot.com/2011/11/etape-2-du-tutorial-configuration-dun.html).
Dans cette partie nous allons créer les objets métiers indépendamment de l’aspect Web Service (les annotations seront ajoutées dans le billet suivant). La seule spécificité Web Service de cette étape est la définition d’une exception supportant les particularités de JAX-WS et son utilisation.
Nous allons voir, qu’avec JAX-WS, il faut spécialiser sa propre exception si on souhaite que le client du service puisse récupérer toutes les informations.
Nous allons créer les éléments suivants :
- Question : il s’agit de l’objet métier qui sert à transporter une information structurée
- l’exception métier pour le service
- l’interface du service
- le bean d’implémentation du service
Rappel des étapes du tutorial sur les services avec JAX-WS :
- Présentation du tutorial et de l'approche Contract First avec JAX-WS
- Etape 2 : Configuration d'un projet Eclipse pour un WebService JAX-WS
- Etape 3, Ce billet : Création des objets métier et d’une exception JAX-WS
L’objet métier Question
Il s’agit d’un objet métier, un simple POJO permettant le stockage des informations correspondant à la question. Comme il s’appuie sur une énumération pour la propriété Urgency, on commence par créer l’enum suivante : UrgencyEnum
Enumération UrgencyEnum
Dans Eclipse, à partir de la barre de menu : File -> New -> Enum.
Dans la dialogue New Java Class :
- Pour Package, tapez : fr.j2ltho.webcontracthelpdesk.server
- Pour Name tapez : UrgencyEnum
Laissez les autres options par défaut et appuyez sur Finish. Il faut maintenant compléter le code. Il s’agit de définir les différentes valeurs de l’enum :
package fr.j2ltho.webcontracthelpdesk.server;
public enum UrgencyEnum {
BUGINPROD, CONFIG, USAGE, BUGINDEV
}
Création de l’objet Question
L’objet Question est un objet métier qui sert à transporter une information structurée entre le client et le serveur de service web. Il me parait préférable de définir des objets métiers dédiés au service web plutôt que de réutiliser tel quel un objet existant :
- l’objet est plus simple et probablement plus adapté aux besoins de l’utilisateur
- vous évitez d’envoyer des informations confidentielles qui pourraient être disponibles dans l’objet métier existant
Nous pouvons maintenant créer notre objet Question. Dans Eclipse, à partir de la barre de menu : File -> New -> Class.
Dans la dialogue New Java Class :
- Pour Package, tapez : fr.j2ltho.webcontracthelpdesk.server
- Pour Name tapez : Question
Laissez les autres options par défaut et appuyez sur Finish. Il faut maintenant compléter le code. Il s’agit de définir les propriétés du bean et ses getter/setter. Nous avons également défini un constructeur.
package fr.j2ltho.webcontracthelpdesk.server;
import java.util.Date;
public class Question {
private String id;
private String description;
private Date submitDate;
private String title;
private String product;
private UrgencyEnum urgency;
private String priority;
private String type;
public Question() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getSubmitDate() {
return submitDate;
}
public void setSubmitDate(Date submitDate) {
this.submitDate = submitDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;
}
public UrgencyEnum getUrgency() {
return urgency;
}
public void setUrgency(UrgencyEnum urgency) {
this.urgency = urgency;
}
public String getPriority() {
return priority;
}
public void setPriority(String priority) {
this.priority = priority;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
Exception métier pour un service web
Par défaut, une exception java contient une propriété Message. C’est cette propriété qui contient l’information sur l’exception.
Pour les services web on parle de Fault. Il s’agit d’un message que peut renvoyer un service quand il juge qu’il y a une erreur. Cela est proche de l’exception Java, si ce n’est que JAX-WS n’indique pas la propriété Message d’une exception Java dans le WSDL. Cela rend son utilisation délicate pour une autre technologie. En revanche, JAX-WS recherche une propriété faultInfo.
Afin de rendre exploitable les exceptions, nous allons définir un bean FaultBean qui servira à stocker l’information de l’exception.
Puis nous définirons notre propre exception BusinessFaultException qui définira un getter pour récupérer la propriété faultinfo.
Création de l’objet FaultBean
Nous pouvons maintenant créer notre objet Question. Dans Eclipse, à partir de la barre de menu : File -> New -> Class.
Dans la dialogue New Java Class :
- Pour Package, tapez : fr.j2ltho.webcontracthelpdesk.server
- Pour Name tapez : FaultBean
- Cocher la case : Constructor from superclass
Laissez les autres options par défaut et appuyez sur Finish. Il faut maintenant compléter le code. Il s’agit de définir les propriétés du bean et ses getter/setter.
Nous définissons deux propriétés (la liste est libre ainsi que les noms) :
- code pour stocker un identifiant technique
- businessMessage : pour stocker un libellé associé destiné à l’utilisateur
package fr.j2ltho.webcontracthelpdesk.server;
public class FaultBean {
private String code;
private String businessMessage;
public FaultBean() {
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getBusinessMessage() {
return businessMessage;
}
public void setBusinessMessage(String businessMessage) {
this.businessMessage = businessMessage;
}
}
Création de l’exception BusinessFaultException
Nous pouvons maintenant créer notre objet Question. Dans Eclipse, à partir de la barre de menu : File -> New -> Class.
Dans la dialogue New Java Class :
- Pour Package, tapez : fr.j2ltho.webcontracthelpdesk.server
- Pour Name tapez : BusinessFaultException
- Superclass : tapez exception est naviguez pour sélectionner : Exception – java.lang
Laissez les autres options par défaut et appuyez sur Finish. Il faut maintenant compléter le code. Il s’agit de d’ajouter la propriété faultInfo et son getter ainsi que deux constructeurs.
On ajoute également la propriété static serialVersionUID car une exception est serialisable.
Pour finir, on ajoute les annotations :
- name sera le nom de la Fault dans la définition du service web
- faultBean indique le nom de l’objet Java contenant l’information
- targetNamespace indique l’espace nom pour les types XML
On obtient le code suivant :
package fr.j2ltho.webcontracthelpdesk.server;
import javax.xml.ws.WebFault;
@WebFault(name="BusinessFault", faultBean="fr.j2ltho.webcontracthelpdesk.server.FaultBean",
targetNamespace = "http://demo.jl2tho.fr")
public class BusinessFaultException extends Exception {
private static final long serialVersionUID = 3061940459819421533L;
private FaultBean faultInfo;
public BusinessFaultException(String internalMessage, FaultBean faultInfo, Throwable cause) {
super(internalMessage, cause);
this.faultInfo = faultInfo;
}
public BusinessFaultException(String internalMessage, FaultBean faultInfo) {
super(internalMessage);
this.faultInfo = faultInfo;
}
public FaultBean getFaultInfo() {
return faultInfo;
}
}
Interface et implémentation du service
Maintenant que les éléments nécessaires à la création du service (Objets métier et exception) existent, nous allons pouvoir créer le service lui même, ou du moins son prototype.
Interface IWebHelpDesk
Nous allons créer une interface avec deux méthodes :
- getQuestionWithId prend une String et retourne une Question.
- createQuestion qui prend un objet Question en entrée et qui retourne un numéro de question
Créons notre interface. Dans Eclipse, à partir de la barre de menu : File -> New -> Interface.
Dans la dialogue New Java Class :
- Pour Package, tapez : fr.j2ltho.webcontracthelpdesk.server
- Pour Name tapez : IWebHelpDesk
Laissez les autres options par défaut et appuyez sur Finish. Il faut maintenant compléter le code. Il s’agit de d’ajouter les deux méthodes. On utilisera l’exception créée précédemment pour renvoyer un éventuel message en cas de problème.
On obtient le code suivant :
package fr.j2ltho.webcontracthelpdesk.server;
public interface IWebHelpDesk {
public Question getQuestionWithId(String pNumero) throws BusinessFaultException;
public String createQuestion(Question pNewQuestion) throws BusinessFaultException;
}
Bean Service HelpdeskServiceBean
Le nom de la classe Java implémentant l’interface doit correspondre à celle définie dans le web.xml pour la servlet. Dans notre cas, ce sera impérativement HelpdeskServiceBean.
Créons notre classe. Dans Eclipse, à partir de la barre de menu : File -> New –> Class.
Dans la dialogue New Java Class :
- Pour Package, tapez : fr.j2ltho.webcontracthelpdesk.server
- Pour Name tapez : HelpdeskServiceBean
- Appuyez sur le bouton Add pour l’interface et choisir IWebHelpDesk - fr.j2ltho.webcontracthelpdesk.server
Laissez les autres options par défaut et appuyez sur Finish. Il faut maintenant compléter le code. Nous allons montrer l’utilisation d’une exception Web service sur les deux méthodes :
- createQuestion retourne une exception si Question est nulle
- getQuestionWithId retourne une exception si le numéro est nulle.
On obtient le code suivant :
package fr.j2ltho.webcontracthelpdesk.server;
public class HelpdeskServiceBean implements IWebHelpDesk {
public String createQuestion(Question pNewQuestion)
throws BusinessFaultException {
if (pNewQuestion==null) {
FaultBean faultBean = new FaultBean();
faultBean.setBusinessMessage("Erreur Question nulle");
faultBean.setCode("01");
// Le message dans l'exception est disponible dans l'exception recu
// mais sa déclaration est absente du wsdl
throw new BusinessFaultException("Internal Message" , faultBean );
}
return null;
}
public Question getQuestionWithId(String pNumero)
throws BusinessFaultException {
if (pNumero==null) {
FaultBean faultBean = new FaultBean();
faultBean.setBusinessMessage("Erreur : Numero de question nul");
faultBean.setCode("02");
// Le message dans l'exception est disponible dans l'exception recu
// mais sa déclaration est absente du wsdl
throw new BusinessFaultException("Internal Message" , faultBean );
}
return null;
}
}
On voit que l’utilisation d’une exception dans le cadre d’un service web est un peu plus compliqué qu’en Java traditionnel si on souhaite que le client puisse correctement récupérer les informations : dans un premier temps on crée notre FaultBean avec les informations transmises au client. Puis on crée l’exception avec ce FaultBean en paramètre.
Conclusion
Nous avons vu dans ce billet, le mécanisme de création d’une exception pour un service web.
Nous avons créé tous les objets Java qui vont être nécessaires à la définition de notre WSDL. Mais, comme vous avez pu le constater, ces objets sont vides : on ne peut pas dire que nous ayons codé. Nous sommes rester concentrer sur la définition du service.
Dans l’étape suivante : http://jl2tho.blogspot.com/2011/12/etape-4-annotations-jax-ws-et-jaxb-des.html, nous allons annoter nos objets Java afin que le WSDL correspondent à notre besoin.
Etapes : 1 | 2 | 3 | 4 | 5 – Suivant >
DiggIt!
Enregistrer sur Del.icio.us
0 commentaires:
Enregistrer un commentaire