tutorial servicios servicio services jax curso crear consumir con java .net web-services interop dataset

services - servicios web java tutorial



AnĂ¡lisis de un conjunto de datos.NET devuelto desde un servicio web.NET en Java (3)

Tengo que consumir un servicio web alojado en .NET desde una aplicación Java. La interoperabilidad entre los dos suele ser muy buena. El problema que estoy encontrando es que el desarrollador de la aplicación .NET eligió exponer los datos usando el objeto DataSet .NET. Hay muchos artículos escritos sobre por qué no debería hacer esto y cómo dificulta la interoperabilidad:

Mi problema es que, a pesar de que no se recomienda esta práctica, tengo que consumir un servicio web que devuelve un DataSet con Java. Cuando generas un proxy para algo como esto con algo que no sea .NET, básicamente terminas con un objeto que se ve así:

@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true) protected Schema schema; @XmlAnyElement(lax = true) protected Object any;

Este primer campo es el esquema real que debe describir el DataSet. Cuando proceso esto utilizando JAX-WS y JAXB en Java, trae todo el esquema XS como objetos Java para ser representados aquí. Caminar por el árbol de objetos de JAXB es posible pero no bonito. El campo any representa el XML sin procesar para el DataSet que se encuentra en el esquema especificado por el esquema.

La estructura del conjunto de datos es bastante consistente pero los tipos de datos sí cambian. Necesito acceso a la información de tipo y el esquema varía de una llamada a otra. He pensado en algunas opciones, pero ninguna parece ser "buena".

  • Tratar de generar objetos Java a partir del esquema utilizando JAXB en tiempo de ejecución parece ser una mala idea. Esto sería demasiado lento ya que tendría que suceder cada vez.
  • La fuerza bruta recorre el árbol de esquema utilizando los objetos JAXB que trajo JAX-WS.
  • Tal vez en lugar de usar JAXB para analizar el esquema sería más fácil tratarlo como XML y usar XPath para intentar encontrar la información de tipo que necesito.

¿Hay otras opciones que no he considerado? ¿Hay una biblioteca de Java para analizar objetos DataSet fácilmente? ¿Qué han hecho otras personas que pueden tener situaciones similares?


¿Ha considerado utilizar XSLT en el XML sin formato devuelto para masajearlo en algo que pueda manejar más fácilmente?

He utilizado ese enfoque para convertir un valor de retorno complejo en algo similar a

<ops> <set name="foo" value="bar"/> <set name="foo2" value="bar2" /> .... </ops>

Esto mueve la lógica a un lenguaje adecuado para procesar XML en lugar de codificarlo manualmente en Java.


¿Se está ejecutando su aplicación Java en un servidor? Si es así, instale Mono en el servidor y use ADO.NET integrado en Mono para convertir el conjunto de datos en algo que Java pueda entender. La ventaja es que toda la interpretación del conjunto de datos se realiza para usted en Mono. Incluso puede utilizar IKVM para permanecer en el mundo del lenguaje Java. De todos modos, en el mundo Mono puede tener un servicio local que puede hacer la conversión, o simplemente tener una utilidad que convierte el conjunto de datos en el sistema de archivos en un formato que Java pueda entender.


Lamentablemente no creo que haya una respuesta fácil aquí. Lo que haría sería crear un servicio web Proxy en .NET al que pudieras llamar desde Java y recibiría el conjunto de datos, lo transformaría en algo más consumible y luego lo devolvería a tu código Java.