2010-04-19 11 views
17

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 al que me estoy enfrentando es que el desarrollador de la aplicación .NET eligió exponer datos usando el objeto .NET DataSet. Hay un montón de artículos escritos por qué usted no debe hacer esto y cómo se hace la interoperabilidad difícilAnálisis de un .NET DataSet devuelto de .NET Web Service en Java

Mi problema es que a pesar de que no es una práctica recomendada, me veo obligado a tener que consumir un servicio web que devuelve un DataSet con Java. Al generar un proxy para algo como esto con distinta .NET que, básicamente, termina con un objeto que tiene este aspecto nada:

@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 conjunto de datos. Cuando proceso esto usando JAX-WS y JAXB en Java, traigo todos los XS-Schema como objetos de Java para representarlos 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 está en el esquema especificado por el esquema.

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

  • Intentar 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 siempre.
  • fuerza bruta recorrer el árbol del esquema mediante el JAXB objetos que JAX-WS trajo.
  • Tal vez en lugar de utilizar JAXB para analizar el esquema que sería más fácil tratar con él como XML y utilizar XPath para tratar de encontrar la escriba la información que necesito.

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

Respuesta

9

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

+0

Por favor, hágamelo saber si alguno de ustedes trató prácticamente, –

3

¿Su aplicación Java se está ejecutando en un servidor? Si es así, instale Mono en el servidor y use ADO.NET integrado en Mono para convertir el Dataset en algo que Java pueda entender. La ventaja es que toda la interpretación del Dataset está hecha para ti en Mono. Incluso puede usar IKVM para permanecer en el mundo de lenguaje Java. De todos modos, en el mundo Mono puedes tener un servicio local que puede hacer la conversión, o simplemente tener una utilidad que convierta el Dataset al sistema de archivos en un formato que Java pueda entender.

+0

Buen pensamiento fuera de la caja. –

+0

Siempre es bueno ser escuchado cuando se piensa fuera de la caja :) – zumalifeguard

+0

Por favor, hágamelo saber si alguno de ustedes intentó prácticamente, –

1

¿Ha considerado utilizar XSLT en el XML sin procesar devuelto para darle un masaje en algo que pueda manejar más fácilmente?

He usado este 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 en un lenguaje muy adecuado para procesar XML en lugar de handcoding en Java.

+0

Por favor, hágame saber si alguno de ustedes trató prácticamente, –

Cuestiones relacionadas