java - paso - ¿Cómo funciona un cliente generado por wsimport?
wsimport ejemplo (2)
Antes que nada, quiero que sepan 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 de wsimport. Basado en mi investigación, wsimport usa JAXWS. Tenga en cuenta que no tengo conocimiento de JAXWS.
Genere mi cliente usando wsimport. El WSDL que utilicé proviene de un servicio web Axis2 y fue generado automáticamente por Axis2. Las siguientes clases son los resultados de wsimport:
En com.datamodel.xsd
-
DataBeanRequest.java
-
DataBeanResponse.java
-
ObjectFactory.java
-
package-info.java
En 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 beans utilizados por el servidor del servicio web (excepto ObjectFactory
y package-info
). Mientras tanto, MyMethod
y MyMethodResponse
también son beans utilizados para establecer el parámetro de solicitud y respuesta del método / operación del servicio web.
A continuación están mis preguntas: (En realidad, no tiene que contestar todo si no conoce las respuestas a algunas de mis preguntas :). Y no dude en compartir cualquier información que considere útil.)
Estoy en lo correcto con
- ¿Estoy en lo correcto con mis suposiciones arriba?
- ¿Cuáles son las funciones de las otras clases?
- Inspeccioné
MyWebService
y contiene una anotación que hace referencia a la ubicación absoluta del WSDL que usé para generar el cliente. ¿Cuál es la relevancia de especificar lawsdllocation
en el cliente? ¿Cómo usa el cliente esa información? - Noté que la URL real del servicio web no está declarada en ninguna de las clases generadas. ¿Cómo sabe el cliente dónde necesita conectarse?
- ¿El archivo WSDL fue anotado para que el cliente pueda leer la URL en el archivo WSDL al conectarse? Si es así, ¿significa que el archivo WSDL siempre se lee cuando se debe establecer una nueva conexión?
-
Como necesito compilar mi aplicación e instalarla en un servidor diferente, la contraseña no será válida.¿Puedo establecerlo en una ruta relativa en lugar de una ruta absoluta?¿Cómo?(Respuesta: Sí, se puede establecer en una ruta relativa. El comandowsimport
tiene un atributowsdllocation
en el que se puede especificar el valor dewsdllocation
). - ¿Qué ocurre 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?
Antes de responder las preguntas, algunas aclaraciones: JAX-WS es una especificación para implementar servicios web en Java. Describe cómo pueden correlacionarse los artefactos WSDL con las clases de 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 de Java. Hay varias implementaciones alternativas, como Axis2, CXF o Metro, que mejoran el soporte básico JAX-WS con soporte para estándares adicionales tales como WS-ReliableMessaging o WS-Security.
Ahora a tus preguntas:
¿Estoy en lo correcto con mis suposiciones arriba?
Sí es usted.
¿Cuáles son las funciones de las otras clases?
La información del package-info
existe para asignar el espacio de nombres XML utilizado en el servicio web al paquete en el que residen sus clases de implementación. 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.
ObjectFactory
permite crear cualquiera de los mensajes enviados y recibidos por el servicio. Lo necesita si desea enganchar el código en frente de su clase de código auxiliar, 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 al portType
en su WSDL. Es decir, mapea 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), deberá implementar esta interfaz. A medida que implementa el cliente, simplemente lo usa.
Finalmente, la clase MyWebService
contiene el código auxiliar del cliente que necesita si desea invocar el servicio web.
Inspeccioné MyWebService y contiene una anotación que hace referencia a la ubicación absoluta del WSDL que usé para generar el cliente. ¿Cuál es la relevancia de especificar la wsdllocation en el cliente? ¿Cómo usa el cliente esa información?
La interfaz que generó contiene la firma del portType
del servicio, pero no explica cómo puede hablar con el servicio. Esto es parte del enlace en WSDL. La configuración más básica es un estilo de documento / literal para los mensajes que utilizan SOAP a través de HTTP. Otras configuraciones, como SOAP sobre JMS, son posibles y su cliente necesita saber qué protocolo usar. Por lo tanto, necesita el enlace WSDL. Además, como dirá más adelante, no hay una dirección de punto final en sus archivos Java. Esta dirección también se lee del WSDL.
Noté que la URL real del servicio web no está declarada en ninguna de las clases generadas. ¿Cómo sabe el cliente dónde necesita conectarse?
Lee la address
del port
del service
en el WSDL. Esto se encuentra al final del WSDL.
¿El archivo WSDL fue 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í, ¿significa que el archivo WSDL siempre se lee cuando se debe establecer una nueva conexión?
Bueno, podría haber almacenamiento en caché en el lado del cliente (no sé sobre los detalles de la implementación de referencia en este caso). Desde un punto de vista conceptual: sí, lo es.
¿Qué ocurre si necesito conectarme a un HTTPS? ¿Cómo puedo configurar el certificado del servidor?
Esto puede ser complicado, no puedo darle una respuesta lista para usar. Sugeriría leer preguntas sobre este tema, como esta .
¿Hay alguna diferencia cuando genero mi cliente usando wsimport y cuando lo genero usando Axis2 o Apache CXF?
Sí hay. wsimport es mejor, no use wsdl2java. Aquí hay una descripción, por qué .
Preguntaste: noté que la URL real del servicio web no está declarada en ninguna de las clases generadas. ¿Cómo sabe el cliente dónde necesita conectarse?
Si el WSDL se descargó usando un navegador y se pasó como entrada a wsimport , entonces la ubicación del archivo wsdl local 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 lo utiliza con un método principal).
Si la URL del wsdl se transfirió como entrada a wsimport , esa URL se incrustó en el código generado, que se utiliza para obtener la ubicación real del servicio. La idea es que las ubicaciones de 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 general, esto no sucede, ya que las ubicaciones de los servicios nunca son IP sino nombres DNS]
Es por eso que nunca es una buena idea publicar el wsdl en el mismo servidor donde se ejecuta su servicio web.