Problème
Dans le développement JAX-WS, lorsque le service suivant est déployé,
File: HelloWorld.java
package com.mkyong.ws;//Service Endpoint Interface @WebService public interface HelloWorld{ @WebMethod String getHelloWorldAsString(); }
File: HelloWorldImpl.java
//Service Implementation package com.mkyong.ws; @WebService(endpointInterface = "com.mkyong.ws.HelloWorld") public class HelloWorldImpl implements HelloWorld{ @Override public String getHelloWorldAsString() { //... } }
Il frappe immédiatement le message d’erreur suivant?
Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class com.mkyong.ws.jaxws.GetHelloWorldAsString is not found. Have you run APT to generate them? at com.sun.xml.internal.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:256) //...
Solution
L’interface de point de terminaison de service n’est annotée avec aucun
@ SOAPBinding
, elle utilise donc le style de document
par défaut
pour le publier. Pour une lisibilité humaine, vous pouvez le réécrire comme suit:
//Service Endpoint Interface @WebService @SOAPBinding(style = Style.DOCUMENT, use=Use.LITERAL) public interface HelloWorld{ @WebMethod String getHelloWorldAsString(); }
Dans le style de document, vous devez utiliser l’outil “ wsgen ” pour générer tous les artefacts portables JAX-WS nécessaires (classes de mappage, schéma wsdl ou xsd) pour la publication de service.
Commande wsgen
La commande wsgen est requise pour lire la classe d’implémentation de noeud final de service:
wsgen -keep -cp . com.mkyong.ws.HelloWorldImpl
Il génère deux classes pour une seule méthode
getHelloWorldAsString ()
, sous le dossier
package.jaxws
.
-
GetHelloWorldAsString.java
-
GetHelloWorldAsStringResponse.java
Copiez ces classes dans le bon dossier. Dans ce cas, il s’agit de « com.mkyong.ws.jaxws ». Essayez de le publier à nouveau.
Référence
documentation de l’outil]
lien://tag/jax-ws/[jax-ws]lien://tag/web-services/[services web]