JAX-WS remplace JAX-RPC à partir de JEE 5. Ce changement de nom reflète la changement de philosophie des développements Web Services en Java, passant d’un modèle «RPC» à un modèle «document»
A partir de J2SE 5, le langage intègre des annotations permettant de simplifier le développement de Web Services.
Ces annotations correspondent à la JSR 224 et à la JSR 181.
La version intégré à JEE 5 est JAX-WS 2.0 L’implémentation de référence de la norme est un sous-projet OpenSource qui fait partie du projet «Metro».
Metro lui-même est un sous projet de GlassFish le serveur d’application OpenSource de Sun.
Messages XML destinés à représenter, indépendamment du langage de programmation, l’invocation d’un service, ainsi que son résultat éventuel.
La structure générale de la requête et de la réponse est imposée par la spécification. Cette dernière aborde aussi les problèmes d’encodage des paramètres, notamment des tableaux et des graphes d’objets : RPC / encoded.
Ce modèle de messages est le plus simple des deux, mais aussi le plus contraignant.
La spécification SOAP n’impose, dans ce cas, aucune contrainte sur la structure de ces messages. Le sens des données XML véhiculées est laissé à l’appréciation des applications participant à l’échange.
Ce modèle de messages offre plus de liberté, mais peut être à l’origine de problèmes d’interopérabilité.
| Annotation | |
|---|---|
| @WebService | Marque une classe comme WS |
| @WebMethod | Expose une méthode comme une opération SOAP |
| @Oneway | Marque une action comme sans retour. Ne s’applique qu’à une méthode sans paramètre de sortie |
| @SOAPBinding | Permet de spécifier l’encodage du message (RPC ou Document) |
| @WebParam | Permet de spécifier le mapping entre un paramètre de la méthode java et un élément du message XML |
| @WebResult | Permet de spécifier le mapping entre la valeur de retour de la méthode java et un élément du message XML |
| @HandlerChain | Permet de préciser un fichier de configuration pour la factorisation des gestionnaires |
| @BindingType | Précise le type de bind du service (protocole) |
| @RequestWrapper | Permet à JAXB de mapper les éléments XML de la requête avec les éléments java associés |
| @ResponseWrapper | Permet à JAXB de mapper les éléments XML de la réponse avec les éléments java associés |
| @ServiceMode | Permet l’accès au message complet ou au payload |
| @WebFault | Permet de gérer le mapping entre une exception Java et une Fault SOAP |
@WebService(name="Convertisseur",
serviceName="ConvertisseurService",
targetNamespace="peut.etre.different")
}
WebService(endpointInterface="fr.lgr.exemple.ws.Convertisseur")
public class ConvertisseurImpl implements Convertisseur {
@WebMethod
public double getEuro(double franc) throws ConvertisseurException {
//toDo
}
}
@WebFault
public class ConvertisseurException extends RemoteException {
}
@WebServiceClient(name = "ConvertisseurImplService",
targetNamespace = "http://impl.ws.exemple.lgr.fr/",
wsdlLocation = "http://localhost:9080/convertisseur-web/mesWebServices/Convertisseur?wsdl")
public class ConvertisseurImplService
extends Service
{
//todo
}
@WebService(name = "Convertisseur",
targetNamespace = "peut.etre.different")
@XmlSeeAlso({ ObjectFactory.class })
public interface Convertisseur {
@WebMethod
@WebResult(targetNamespace = "")
@RequestWrapper(localName = "getEuro",
targetNamespace = "peut.etre.different",
className = "fr.lgr.exemple.ws.client.generated.GetEuro")
@ResponseWrapper(localName = "getEuroResponse",
targetNamespace = "peut.etre.different", className = "fr.lgr.exemple.ws.client.generated.GetEuroResponse")
public double getEuro(
@WebParam(name = "arg0", targetNamespace = "")
double arg0);
Tomcat ne bénéficiant pas nativement des fonctionnalités Jax-ws il faut donc modifier son application pour y ajouter cette fonctionnalité
Mode opératoire :
<servlet>
<servlet-name>jaxws-servlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jaxws-servlet</servlet-name>
<url-pattern>/ReponseService</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<endpoints>
<endpoint name="ReponseService"
implementation="td4.Reponse"
url-pattern="/ReponseService">
</endpoint>
</endpoints>