L'analyse d'une .NET DataSet retourné à partir de un .NET Web Service en Java
J'ai à en consommer .NET hébergé service web à partir d'une application Java. L'interopérabilité entre les deux est généralement très bonne. Le problème, je suis en cours d'exécution en est que l' .NET développeur de l'application a choisi d'exposer les données à l'aide de l' .NET objet DataSet. Il y a beaucoup d'articles écrits pour expliquer pourquoi vous ne devriez pas faire cela et comment il rend l'interopérabilité difficile:
- http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx
- http://www.lhotka.net/weblog/ThoughtsOnPassingDataSetObjectsViaWebServices.aspx
- http://aspnet.4guysfromrolla.com/articles/051805-1.aspx
- http://www.theserverside.net/tt/articles/showarticle.tss?id=Top5WSMistakes
Mon problème est que, malgré ce qui n'est pas recommandé en pratique, je suis coincé avec le devoir de consommer un service web retournant un ensemble de données avec Java. Lorsque vous générez un proxy pour quelque chose comme ça avec autre chose que de l' .NET en gros, vous avez jusqu'à la fin avec un objet qui ressemble à ceci:
@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true)
protected Schema schema;
@XmlAnyElement(lax = true)
protected Object any;
Ce premier champ est le schéma qui doit décrire le jeu de données. Quand j'ai ce processus à l'aide de JAX-WS et JAXB en Java, il mettre tous XS-Schéma comme des objets Java à être représentés ici. La marche de l'arbre des objets de JAXB est possible, mais pas assez. Le tout terrain, représente le XML brut pour le jeu de données dans le schéma spécifié par le schéma.
La structure de la base de données est assez cohérente, mais les types de données changent. J'ai besoin d'accéder à l'information concernant le type et le schéma n'varier d'un appel à l'autre. J'ai bien quelques options, mais aucune ne semble comme 'bon' options.
- En essayant de générer des objets Java à partir du schéma à l'aide de JAXB au moment de l'exécution semble être une mauvaise idée. Ce serait beaucoup trop lent, car il devra arriver à chaque fois.
- La force Brute qui marche le schéma de l'arbre à l'aide de la JAXB objets que JAX-WS apporté.
- Peut-être au lieu d'utiliser JAXB pour analyser le schéma, il serait plus facile de le traiter comme XML et l'utilisation de XPath pour essayer de trouver le type d'information dont j'ai besoin.
Existe-il d'autres options que je n'ai pas pris en compte? Est-il une bibliothèque Java pour analyser des objets DataSet facilement? Ce qu'ont d'autres personnes fait qui peut avoir des situations similaires?
Vous devez vous connecter pour publier un commentaire.
Malheureusement, je ne pense pas qu'il y a une réponse facile ici. Ce que je voudrais faire est de créer un Proxy service web .NET que vous pouvez appeler à partir de Java qui recevrait le jeu de données, les transformer en quelque chose de plus consommable, et puis retour à votre code Java.
Est votre application Java s'exécutant sur un serveur? Si oui, installer Mono sur le serveur et de les utiliser ADO.NET construit en Mono pour convertir le jeu de données en quelque chose de Java peut comprendre. L'avantage est que toute l'interprétation de l'ensemble de données est fait pour vous en Mono. Vous pouvez même utiliser IKVM pour rester dans le langage Java monde. De toute façon, dans le Mono monde, vous pouvez avoir un service de proximité qui peuvent faire la conversion, ou tout simplement avoir un utilitaire qui convertit le jeu de données dans le système de fichiers dans un format que Java peut comprendre.
Avez-vous considéré l'utilisation de XSLT sur le XML brut, retourné à masser quelque chose que vous pouvez gérer plus facilement?
J'ai utilisé cette approche pour convertir un complexe de valeur de retour dans quelque chose de semblable à
Cela déplace la logique dans un langage bien adapté au processus XML au lieu de handcoding en Java.