¿Cómo funciona un cliente generado por wsimport?


Antes que nada, quiero que sepas que ya puedo conectarme al servidor del servicio web. Estoy haciendo esta pregunta porque quiero obtener un conocimiento más profundo sobre cómo funciona un cliente generado por wsimport. Basado en mi investigación, wsimport utiliza JAXWS. Tenga en cuenta que no tengo conocimiento de JAXWS.

Generé mi cliente usando wsimport. El WSDL que utilicé es de un servicio web Axis2 y fue generado automáticamente por Axis2. Las clases a continuación son los resultados de wsimport:

Bajo com.datamodel.xsd

  • DataBeanRequest.java
  • DataBeanResponse.java
  • ObjectFactory.java
  • package-info.java

Bajo com.service

  • MyWebService.java
  • MyWebServicePortType.java
  • MyMethod.java
  • MyMethodResponse.java
  • ObjectFactory.java
  • package-info.java

Con las clases anteriores, puedo decir que com.datamodel.xsd contiene los frijoles utilizados por el servidor del servicio web (excluyendo ObjectFactory y package-info). Mientras tanto, MyMethod y MyMethodResponse también son frijoles utilizados para establecer la solicitud y la respuesta parámetro del método/operación del servicio web.

A continuación están mis preguntas: (Realmente no tienes que responder a todas si no sabes las respuestas a algunas de mis preguntas. :) Y por favor no dude en compartir cualquier información que usted piensa que podría encontrar útil.)

Estoy en lo cierto con

  • ¿Estoy en lo correcto con mis suposiciones anteriores?
  • ¿Cuál es la función de las otras clases?
  • Inspeccioné MyWebService y contiene una anotación que se refiere a la absoluta ubicación del WSDL que utilicé para generar el cliente. ¿Cuál es la relevancia de especificar el wsdllocation en el cliente? ¿Cómo utiliza el cliente esa información?
  • He notado que la URL real del servicio web no está declarada en ninguna de las clases generadas. ¿Cómo sabe el cliente a dónde necesita conectarse?
  • ¿Se anotó el archivo WSDL para que el cliente pueda leer la URL del archivo WSDL al conectarse? Si es así, entonces significa que el archivo WSDL siempre se lee cuando un nuevo ¿se debe establecer la conexión?
  • Dado que hay una necesidad para mí para compilar mi aplicación e instalarla en un servidor diferente, el se convertirá en inválido. ¿Puedo configurarlo como una ruta relativa en lugar de una ruta absoluta? ¿Cómo? (Respuesta: Sí, se puede establecer como una ruta relativa. El comando wsimport tiene un atributo wsdllocation en el que se puede especificar el valor del wsdllocation.)
  • Y si necesito conectarme a un HTTPS. ¿Cómo puedo configurar el certificado del servidor?
  • ¿hay alguna diferencia cuando genero mi cliente usando wsimport y cuando lo genero usando Axis2 o Apache CXF.
Author: joergl, 2012-09-03

2 answers

Antes de responder a las preguntas, algunas aclaraciones: JAX-WS es una especificación para implementar servicios web en Java. Describe cómo se pueden asignar artefactos WSDL a clases Java y cómo se puede aplicar esta asignación mediante anotaciones. Puede descargar la especificación aquí. La herramienta wsimport es parte de la implementación de referencia de esta especificación y la implementación de referencia es parte de la biblioteca de clases Java. Hay varias implementaciones alternativas, tales como Axis2, CXF o Metro, que mejoran el soporte básico de JAX-WS con soporte para estándares adicionales como WS-ReliableMessaging o WS-Security.

Ahora a sus preguntas:

¿Estoy en lo correcto con mis suposiciones anteriores?

Sí, lo eres.

¿Cuál es la función de las otras clases?

El package-info existe para asignar el espacio de nombres XML utilizado en el servicio web al paquete en el que residen las clases de implementación. El el espacio de nombres normalmente se ve diferente de un nombre de paquete Java (normalmente, es una URL) y esto hace que la asignación sea necesaria.

El ObjectFactory le permite crear cualquiera de los mensajes enviados y recibidos por el servicio. Necesitas esto si quieres enganchar código delante de tu clase stub, proporcionar mensajes modificados o cosas similares.

No puedo ver el contenido de sus clases, pero si lo entiendo bien MyWebServicePortType es una interfaz que se asemeja a portType en su WSDL. Es decir, mapas las operaciones y sus firmas en los métodos WSDL a Java. Si desea proporcionar el servicio (que no lo hace, está preguntando por el cliente), tendría que implementar esta interfaz. A medida que implementa el cliente, simplemente lo usa.

Finalmente, la clase MyWebService contiene el stub del cliente que necesita si desea invocar el servicio web.

Inspeccioné MyWebService y contiene una anotación referente a la ubicación absoluta del WSDL que solía generar el cliente. Lo ¿es relevante especificar el wsdllocation en el cliente? Cuan ¿el cliente usa esa información?

La interfaz que generaste contiene la firma del portType del servicio, pero no explica cómo puedes hablar con el servicio. Esto es parte del enlace en el WSDL. La configuración más básica es un estilo de documento / literal para los mensajes que usan SOAP sobre HTTP. Otras configuraciones, como SOAP sobre JMS, son posibles y su cliente necesita sepa qué protocolo usar. Por lo tanto, necesita el enlace WSDL. Además, como se indica más adelante, no hay ninguna dirección de punto final en los archivos Java. Esta dirección también se lee en el WSDL.

He notado que la URL real del servicio web no está declarada en cualquiera de las clases generadas. Cómo sabe el cliente dónde necesita para conectar?

Lee el address de la port de la service en el WSDL. Esto se encuentra al final del WSDL.

Fue el archivo WSDL anotado para que el cliente pueda leer la URL en el ¿Archivo WSDL al conectarse?

No, el port es un elemento típico de un punto final de servicio web concreto. No se necesita nada especial aquí.

Si es así, entonces significa que el archivo WSDL siempre se lee cuando un nuevo ¿se debe establecer la conexión?

Bueno, podría haber almacenamiento en caché en el lado del cliente (no conozco los detalles de la implementación de referencia en este). Desde un punto de vista conceptual: sí, lo es.

Y si necesito conectarme a un HTTPS. Cómo puedo configurar el servidor certificado

Esto puede ser complicado, no puedo darte una respuesta fuera de la caja. Yo sugeriría leer a través de preguntas sobre este tema, como este.

¿Hay alguna diferencia cuando genero mi cliente usando wsimport y cuando lo genero usando Axis2 o Apache CXF

Sí, lo hay. wsimport es mejor, no utilice wsdl2java. Aquí hay una descripción, por qué.

 43
Author: joergl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:21

Usted preguntó: Me di cuenta de que la URL real del servicio web no se declara en ninguna de las clases generadas. ¿Cómo sabe el cliente a dónde necesita conectarse?

Si el WSDL se descargó usando un navegador y se pasó como entrada a wsimport, luego, la ubicación local del archivo wsdl se incrusta en el código generado. Es por eso que no ve la ubicación real del servicio en el código generado. También significa que si eliminó la copia local del archivo wsdl el código generado no funcionará (cuando se inicia usando un método principal) .

Si la URL del wsdl fue pasada como entrada a wsimport luego, esa URL se incrusta en el código generado, que se usa más para obtener la ubicación real del servicio. La idea es que las ubicaciones WSDL sean fijas. Se espera que estén en un UDDI o como un archivo local. Esto permite que los servicios reales se muevan y si se mueven, solo tiene que modificar la copia local del archivo wsdl solo o actualizar el wsdl en el UDDI. [en su mayoría esto no sucede ya que las ubicaciones de servicio nunca son IP sino nombres DNS]

Esta es la razón por la que nunca es una buena idea publicar el wsdl en el mismo servidor donde se ejecuta su servicio web

 3
Author: krish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-15 11:21:09