Je suis relativement nouveau dans le monde des services Web et mes recherches semblent m'avoir plus dérouté que m'éclairer, mon problème est que j'ai reçu une bibliothèque (jar) que je dois étendre avec des fonctionnalités de services Web.
Cette bibliothèque sera partagée avec d'autres développeurs, et parmi les classes du jar, il y aura des classes qui ont une méthode qui appelle un webservice (qui définit essentiellement un attribut de la classe, fait une logique métier, comme le stockage de l'objet dans une base de données, etc et renvoie l'objet avec ces modifications). Je veux rendre l'appel à ce service aussi simple que possible, espérons-le aussi simple afin que le développeur utilisant la classe n'ait qu'à le faire.
Car c = new Car("Blue");
c.webmethod();
J'ai étudié JAX-WS à utiliser sur le serveur mais il me semble que je n'ai pas besoin de créer un wsimport
dans le serveur ni le wsimport
sur le client, puisque je sais que les deux ont les classes, j'ai juste besoin d'une interaction entre les classes partagé à la fois sur le serveur et le client. Comment pensez-vous qu'il est logique de faire le service Web et l'appel en classe?
Réponses:
Je comprends que votre problème se résume à la façon d'appeler un service Web SOAP (JAX-WS) à partir de Java et d'obtenir son objet de retour . Dans ce cas, vous avez deux approches possibles:
wsimport
et utilisez-les; ouÀ propos de la première approche (en utilisant
wsimport
):Je vois que vous avez déjà les services (entités ou autres) classes d'affaires, et c'est un fait que le
wsimport
génère un tout nouvel ensemble de classes (qui sont en quelque sorte des doublons des classes que vous avez déjà).J'ai peur, cependant, dans ce scénario, vous ne pouvez que:
wsimport
code généré pour qu'il utilise votre classes métier (c'est difficile et ça ne vaut pas la peine - gardez à l'esprit que chaque fois que le WSDL change, vous devrez régénérer et réadapter le code); ouwsimport
classes générées. (Dans cette solution, votre code métier pourrait "utiliser" les classes générées en tant que service d'une autre couche architecturale.)À propos de la deuxième approche (créez votre client SOAP personnalisé):
Afin de mettre en œuvre la deuxième approche, vous devrez:
java.net.HttpUrlconnection
(et une certainejava.io
manipulation).Créer un client SOAP avec classic
java.net.HttpUrlConnection
n'est pas si difficile (mais pas si simple non plus), et vous pouvez trouver dans ce lien un très bon code de démarrage.Je vous recommande d'utiliser le framework SAAJ:
Voir ci-dessous un exemple fonctionnel (exécutez-le!) D'un appel de service Web SOAP utilisant SAAJ. Il appelle ce service Web .
À propos de l'utilisation de JAXB pour la sérialisation / désérialisation, il est très facile de trouver des informations à ce sujet. Vous pouvez commencer ici: http://www.mkyong.com/java/jaxb-hello-world-example/ .
la source
<xsd:element name="Incident_Number" type="xsd:string"/>
. Comme vous pouvez le voir, l'élément est fermé et aucune information n'est générée à partir du WS.GetInfoByCity
est503Service Unavailable
, il voit. :(Ou utilisez simplement wsdl2java d'Apache CXF pour générer des objets que vous pouvez utiliser.
Il est inclus dans le package binaire que vous pouvez télécharger depuis leur site Web. Vous pouvez simplement exécuter une commande comme celle-ci:
Il utilise le wsdl pour générer des objets, que vous pouvez utiliser comme ceci (les noms d'objet sont également extraits du wsdl, donc le vôtre sera un peu différent):
Il existe même un plug-in Maven qui génère les sources: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html
Remarque: Si vous générez des sources à l'aide de CXF et IDEA, vous pouvez consulter ceci: https://stackoverflow.com/a/46812593/840315
la source
J'ai trouvé une manière alternative beaucoup plus simple de générer un message savon. Étant donné un objet Personne:
Vous trouverez ci-dessous un simple générateur de messages Soap:
Vous pouvez utiliser par:
la source