Comment fonctionne un client généré par wsimport?
avant toute chose, je veux que vous sachiez que je peux déjà me connecter au serveur de service web. Je pose cette question parce que je veux approfondir mes connaissances sur le fonctionnement d'un client généré par wsimport. D'après mes recherches, wsimport utilise JAXWS. S'il vous plaît noter que je n'ai aucune connaissance de JAXWS.
j'ai généré mon client en utilisant wsimport. La WSDL que J'ai utilisée provient d'un service Web Axis2 et a été générée automatiquement par Axis2. Les classes ci-dessous sont les résultats de wsimport:
sous com.datamodel.xsd
-
DataBeanRequest.java
-
DataBeanResponse.java
-
ObjectFactory.java
-
package-info.java
sous com.service
-
MyWebService.java
-
MyWebServicePortType.java
-
MyMethod.java
-
MyMethodResponse.java
-
ObjectFactory.java
-
package-info.java
avec les classes ci-dessus, je peux dire que com.datamodel.xsd
contient les haricots utilisés par le serveur de service web (à l'exclusion de ObjectFactory
et package-info
). Pendant ce temps, MyMethod
et MyMethodResponse
sont également des haricots utilisés pour définir le paramètre de demande et de réponse de la méthode/opération de service web.
Voici mes questions: répondre à toutes si vous ne connaissez pas les réponses à certaines de mes questions. :) Et n'hésitez pas à partager l'info que vous pensez que je pourrais trouver utile.)
ai-je raison avec
- suis-je correct avec mes hypothèses ci-dessus?
- Quelle est la fonction des autres classes?
- j'ai inspecté
MyWebService
et il contient une annotation se référant à l'emplacement absolu du WSDL I utilisé pour générer le client. Quelle est la pertinence de spécifier lewsdllocation
dans le client? Comment le client utilise-t-il cette information? - j'ai remarqué que L'URL réelle du service web n'est déclarée dans aucune des classes générées. Comment le client sait-il où il doit se connecter?
- le fichier WSDL était-il annoté pour que le client puisse lire L'URL du fichier WSDL lors de la connexion? Si c'est le cas, cela signifie-t-il que le fichier WSDL est toujours lire lorsqu'une nouvelle connexion doit être établie?
-
Puisqu'il y a un besoin pour moi de compiler mon application et l'installer sur un serveur différent, le deviendra invalide. Puis-je le mettre sur un chemin relatif au lieu d'un chemin absolu? Comment? (Réponse: Oui, il peut être réglé sur un chemin relatif. La commandewsimport
possède un attributwsdllocation
dans lequel la valeur dewsdllocation
peut être spécifiée.) - Que faire si je dois connectez-vous à un HTTPS. Comment définir le certificat du serveur?
- y a-t-il une différence lorsque je génère mon client en utilisant wsimport et lorsque je le génère en utilisant Axis2 ou Apache CXF.
2 réponses
avant de répondre aux questions, Quelques précisions: JAX-WS est une spécification pour la mise en œuvre de services web en Java. Il décrit comment les artéfacts WSDL peuvent être mappés à des classes Java et comment ce mappage peut être appliqué en utilisant des annotations. Vous pouvez télécharger la spécification ici . L'outil wsimport fait partie de l'implémentation de référence de cette spécification et l'implémentation de référence fait partie de la bibliothèque de classe Java. Il y a plusieurs alternatives les implémentations, comme Axis2, CXF ou Metro, qui améliorent le support de base JAX-WS en prenant en charge des standards supplémentaires tels que WS-ReliableMessaging ou WS-Security.
maintenant à vos questions:
Suis-je correct avec mes hypothèses ci-dessus?
Oui, vous l'êtes.
Quelle est la fonction des autres classes?
Le package-info
existe pour mapper L'espace de noms XML utilisé dans le service web au paquet dans lequel résident vos classes d'implémentation. L'espace de noms semble normalement différent du nom D'un paquet Java (normalement, C'est une URL) et cela rend la cartographie nécessaire.
Le ObjectFactory
vous permet de créer des messages envoyés et reçus par le service. Vous en avez besoin si vous voulez insérer du code devant votre classe stub, fournir des messages modifiés ou des choses similaires.
Je ne vois pas le contenu de vos classes, mais si je comprends bien, MyWebServicePortType
est une interface qui ressemble au portType
dans votre WSDL. C'est-à-dire qu'il établit une correspondance entre les opérations et leurs signatures dans les méthodes WSDL et Java. Si vous voulez fournir le service (ce que vous ne faites pas, vous posez des questions sur le client), vous devez mettre en œuvre cette interface. Lorsque vous implémentez le client, vous l'utilisez simplement.
enfin, la classe MyWebService
contient le stub client dont vous avez besoin si vous voulez invoquer le service web.
j'ai inspecté MyWebService et il contient une annotation concernant l'emplacement absolu du WSDL que j'ai utilisé pour générer le client. Quel est-il pertinent de spécifier la localisation wsdllocation dans le client? Comment le client utilise-t-il cette information?
l'interface que vous avez générée contient la signature du portType
du service, mais il n'explique pas comment vous pouvez parler à votre service. Ceci fait partie de la reliure dans le WSDL. Le paramètre le plus basique est un style document/littéral pour les messages utilisant SOAP sur HTTP. D'autres configurations, comme SOAP over JMS, sont possibles et votre client doit savoir quel protocole utiliser. Elle a donc besoin du WSDL contraignant. De plus, comme vous le dites plus tard, il n'y a pas d'adresse de point final dans vos fichiers Java. Cette adresse est également lue dans le WSDL.
I remarqué que l'URL du service web n'est pas déclarée dans toutes les classes générées. Comment le client sait-il où il a besoin pour vous connecter?
il lit le address
du port
du service
dans le WSDL. C'est situé à l'extrémité de la WSDL.
était le fichier WSDL annoté afin que le client puisse lire l'URL sur le Fichier WSDL lors de la connexion?
non, le port
est un élément typique d'un terminal de service Web en béton. Il n'y a rien de spécial ici.
si c'est le cas, cela signifie-t-il que le fichier WSDL est toujours lu lorsqu'un nouveau connexion doit être établie?
Eh bien, il pourrait y avoir une mise en cache côté client (Je ne sais pas les détails de l'implémentation de référence sur celui-ci). À partir d'un point de vue conceptuel: oui, il est.
Que faire si je dois me connecter à un HTTPS. Comment puis-je configurer le serveur certificat
ce peut être délicat, Je ne peux pas vous donner une réponse out-of-the-box. Je suggère de lire les questions sur ce sujet, comme celui-ci .
y a-t-il une différence lorsque je génère mon client en utilisant wsimport et quand je le génère en utilisant Axis2 ou Apache CXF
Oui, il y en a. wsimport est mieux, n'utilisez pas wsdl2java. Voici une description, pourquoi .
vous avez demandé: j'ai remarqué que L'URL réelle du service web n'est déclarée dans aucune des classes générées. Comment le client sait-il où il doit se connecter?
si la WSDL a été téléchargée à l'aide d'un navigateur et transmise comme entrée à wsimport , alors l'emplacement local du fichier wsdl est intégré dans le code généré. C'est pourquoi vous ne voyez pas l'emplacement réel du service dans le le code généré. Cela signifie également que si vous supprimez la copie locale du fichier wsdl, le code généré ne fonctionnera pas (lorsqu'il est inovké en utilisant une méthode principale) .
si L'URL de la wsdl a été passée en tant qu'entrée à wsimport alors cette URL est intégrée dans le code généré, qui est ensuite utilisé pour obtenir l'emplacement du service réel. L'idée est que les emplacements WSDL sont fixes. On s'attend à ce qu'ils soient dans un UDDI ou dans un fichier local. Ce permet aux services actuels de se déplacer et s'ils se déplacent, il vous suffit de modifier la copie locale du fichier wsdl seul ou de mettre à jour la wsdl dans L'UDDI. [la plupart du temps, cela ne se produit pas car les points de service ne sont jamais IP mais des noms DNS]
C'est pourquoi il n'est jamais une bonne idée de publier la wsdl dans le même serveur où votre service web est en cours d'exécution""