Comment un wsimport client généré travail?
Avant toute chose, je veux que vous sachiez que je peux déjà vous connecter au serveur de services web. Je vous pose cette question parce que j'aimerais acquérir une connaissance plus approfondie sur la façon dont un wsimport généré le client fonctionne. En fonction de mes recherches, wsimport utilise JAXWS. Veuillez noter que je n'ai aucune connaissance de JAXWS.
J'ai généré mon client à l'aide de wsimport. Le WSDL que j'ai utilisé est à partir d'un Axis2 et le service web a été généré 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 que dire que com.datamodel.xsd
contient des fèves utilisées par le serveur de service web (à l'exclusion des ObjectFactory
et package-info
). Pendant ce temps, MyMethod
et MyMethodResponse
sont aussi des fèves utilisées pour définir la demande et de la réponse de paramètre de la méthode de service web/de l'opération.
Ci-dessous mes questions sont: (Vous n'avez donc pas à 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.)
Suis-je correct avec
- Suis-je correct avec mes hypothèses ci-dessus?
- Quels sont la fonction des autres classes?
- J'ai inspecté
MyWebService
et qu'il contient une annotation se référant à l'emplacement absolu du fichier WSDL, j'ai utilisé pour générer le client. Quelle est la pertinence de la spécification de lawsdllocation
dans le client? Comment le client ne peut utiliser cette info? - J'ai remarqué que l'URL du service web n'est pas déclaré dans l'une des classes générées. Comment le client de savoir où il doit se connecter à?
- Était le fichier WSDL annoté de sorte que le client peut lire l'URL dans le fichier WSDL lors de la connexion? Si oui, alors ça veut dire que le fichier WSDL est toujours en lecture lors d'une nouvelle connexion doit être établie?
Car il y a un besoin pour moi de compiler mon application et l'installer sur un autre serveur, la volonté de devenir invalide. Puis-je le mettre à un chemin d'accès relatif au lieu d'un chemin d'accès absolu? Comment? (Réponse: Oui, il peut être réglé à un chemin d'accès relatif. Lewsimport
commande a unwsdllocation
attribut dans lequel la valeur de lawsdllocation
peut être spécifié.)- Que faire si j'ai besoin de vous connecter à un site HTTPS. Comment puis-je régler le certificat de serveur?
- Est là toute la différence quand je générer mon client à l'aide de wsimport et quand je le générer à l'aide de Axis2 ou Apache CXF.
Vous devez vous connecter pour publier un commentaire.
Avant que je réponds aux questions, quelques précisions: JAX-WS est une spécification pour la mise en œuvre de web services en Java. Il décrit comment WSDL artefacts peuvent être mappés à des classes Java et comment cette cartographie peut être appliqué à l'aide d'annotations. Vous pouvez télécharger la spécification ici. L'outil wsimport est le cadre de référence de mise en œuvre de cette spécification et l'implémentation de référence est la partie de la bibliothèque de classes Java. Il existe plusieurs implémentations alternatives, telles que Axis2, CXF ou le Métro, qui améliorent la base de JAX-WS soutien de avec le soutien d'autres normes telles que WS-ReliableMessaging ou WS-Security.
Maintenant à vos questions:
Oui, vous l'êtes.
La
package-info
existe pour cartographier l'espace de noms XML utilisés dans le service web pour l'emballage dans lequel vos classes d'implémentation de résidence. L'espace de noms normalement est différente à partir d'un package Java nom (normalement, c'est une URL) et de ce fait, la cartographie nécessaire.La
ObjectFactory
vous permet de créer des messages envoyés et reçus par le service. Vous avez besoin de cette si vous voulez brancher dans le code en face de votre de la classe de stub, modifier des messages ou des choses semblables.Je ne peux pas voir le contenu de vos cours, mais si je comprends bien droit
MyWebServicePortType
est une interface qui ressemble à laportType
dans votre WSDL. C'est, il fait correspondre les opérations et leurs signatures dans le WSDL méthodes de Java. Si vous voulez fournir le service (que vous ne le faites pas, vous vous interrogez le client), vous devez implémenter cette interface. Que vous mettre en œuvre le client, il vous suffit de l'utiliser.Enfin, la classe
MyWebService
contient le stub client dont vous avez besoin si vous voulez invoquer le service web.L'interface que vous avez généré contient la signature de la
portType
du service, mais il n'explique pas comment vous pouvez parler à votre service. C'est la partie de la liaison dans le fichier WSDL. Le réglage de base est un document/literal style pour les messages à l'aide de SOAP sur HTTP. D'autres configurations, comme le SAVON sur JMS, sont possibles et que votre client a besoin de connaître le protocole à utiliser. Par conséquent, il a besoin de la liaison WSDL. Aussi, comme vous le dites plus tard, il n'y a pas d'adresse de point de terminaison dans vos fichiers Java. Cette adresse est également de lire à partir du fichier WSDL.Il lit le
address
de laport
de laservice
dans le fichier WSDL. Il est situé à la fin de l'WSDL.Non, le
port
est typique d'un élément de béton de terminaison de service web. Il n'y a rien de spécial ici.Bien, il pourrait être mise en cache côté client (je ne connais 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.
Cela peut être difficile, je ne peux pas vous donner de dehors-de-le-boîte de réponse. Je vous propose de lire par le biais de questions sur ce sujet, comme celui-ci.
Oui, il est. wsimport est mieux, ne pas utiliser de wsdl2java. Voici une description, pourquoi.
Vous avez demandé: j'ai remarqué que l'URL du service web n'est pas déclaré dans l'une des classes générées. Comment le client de savoir où il doit se connecter à?
Si le WSDL a été téléchargé à l'aide d'un navigateur et transmis en entrée de wsimport, l'emplacement du fichier wsdl est intégré dans le code généré. C'est pourquoi vous ne voyez pas le service de localisation dans le code généré. Cela signifie également que si vous avez supprimé la copie locale du fichier wsdl généré le code ne fonctionne pas (quand inovked à l'aide d'une méthode principale) .
Si l'URL du wsdl a été transmis en entrée de wsimport alors que l'URL est intégré dans le code généré, qui est en outre utilisée pour obtenir le véritable emplacement du service. L'idée est que le WSDL emplacements sont fixes. Ils sont censés être dans un registre UDDI ou comme un fichier local. Cela permet de les services réels à déplacer et s'ils ne déplacer, vous avez juste à modifier la copie locale du fichier wsdl seul ou mettre à jour le fichier wsdl dans le registre UDDI. [la plupart du temps il ne se produit pas comme les lieux de service ne sont jamais IP et les noms DNS]
C'est pourquoi il n'est jamais une bonne idée de publier le wsdl dans le même serveur où votre site web est en cours d'exécution