Soy relativamente nuevo en el mundo de los servicios web y mi investigación parece haberme confundido más que iluminarme, mi problema es que me dieron una biblioteca (jar) que tengo que ampliar con algunas funciones de servicio web.
Esta biblioteca se compartirá con otros desarrolladores, y entre las clases en el jar habrá clases que tengan un método que llame a un servicio web (que esencialmente establece un atributo de la clase, hace algo de lógica comercial, como almacenar el objeto en una base de datos, etc y devuelve el objeto con esas modificaciones). Quiero que la llamada a este servicio sea lo más simple posible, con suerte, tan simple para que el desarrollador que usa la clase solo tenga que hacerlo.
Car c = new Car("Blue");
c.webmethod();
He estado estudiando JAX-WS para usar en el servidor pero me parece que no necesito crear un wsimport
en el servidor ni wsimport
en el cliente, ya que sé que ambos tienen las clases, solo necesito algo de interacción entre clases compartido tanto en el servidor como en el cliente. ¿Cómo crees que tiene sentido hacer el servicio web y la llamada en la clase?
Respuestas:
Entiendo que su problema se reduce a cómo llamar a un servicio web SOAP (JAX-WS) desde Java y obtener su objeto de retorno . En ese caso, tiene dos enfoques posibles:
wsimport
y utilícelas; oSobre el primer enfoque (uso
wsimport
):Veo que ya tiene las clases de negocio de los servicios (entidades u otras), y es un hecho que
wsimport
genera un nuevo conjunto de clases (que de alguna manera son duplicados de las clases que ya tiene).Sin embargo, me temo que en este escenario solo puedes:
wsimport
código generado para que use sus clases de negocios (esto es difícil y de alguna manera no vale la pena; tenga en cuenta que cada vez que cambie el WSDL, tendrá que regenerar y readaptar el código); owsimport
clases generadas. (En esta solución, su código comercial podría "usar" las clases generadas como un servicio desde otra capa arquitectónica).Acerca del segundo enfoque (cree su cliente SOAP personalizado):
Para implementar el segundo enfoque, deberá:
java.net.HttpUrlconnection
(y algo dejava.io
manipulación).Crear un cliente SOAP usando Classic
java.net.HttpUrlConnection
no es tan difícil (pero tampoco tan simple), y puedes encontrar en este enlace un muy buen código de inicio.Te recomiendo que uses el marco SAAJ:
Vea a continuación un ejemplo funcional (¡ejecútelo!) De una llamada de servicio web SOAP usando SAAJ. Llama a este servicio web .
Acerca del uso de JAXB para serializar / deserializar, es muy fácil encontrar información al respecto. Puede comenzar aquí: http://www.mkyong.com/java/jaxb-hello-world-example/ .
fuente
<xsd:element name="Incident_Number" type="xsd:string"/>
. Como puede ver, el elemento está cerrado y no se genera información desde el WS.GetInfoByCity
es503Service Unavailable
, parece. :(O simplemente use wsdl2java de Apache CXF para generar objetos que pueda usar.
Está incluido en el paquete binario que puede descargar desde su sitio web. Simplemente puede ejecutar un comando como este:
Utiliza el WSDL para generar objetos, que se puede utilizar como este (nombres de objeto también se agarraron por el WSDL, por lo que el suyo será un poco diferente):
Incluso hay un complemento de Maven que genera las fuentes: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html
Nota: Si genera fuentes utilizando CXF e IDEA, es posible que desee ver esto: https://stackoverflow.com/a/46812593/840315
fuente
Encontré una forma alternativa mucho más sencilla de generar mensajes de jabón. Dado un objeto de persona:
A continuación se muestra un generador de mensajes de jabón simple:
Puede utilizar por:
fuente