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]