2010-02-17 7 views
2

Considérons les classes suivantes (veuillez prendre en compte les méthodes getter et setter publiques pour les champs privés).Comment marshall un type paramétré avec JAX-WS/JAXB?

// contains a bunch of properties 
public abstract class Person { private String name; } 

// adds some properties specific to teachers 
public class Teacher extends Person { private int salary; } 

// adds some properties specific to students 
public class Student extends Person { private String course; } 

// adds some properties that apply to an entire group of people 
public class Result<T extends Person> { 
    private List<T> group; 

    private String city; 
    // ... 
} 

Nous pourrions avoir la mise en œuvre de services Web suivant annotées comme suit:

@WebService 
public class PersonService { 

    @WebMethod 
    public Result<Teacher> getTeachers() { ... } 

    @WebMethod 
    public Result<Student> getStudents() { ... } 
} 

Le problème est que JAXB semble marshall l'objet de résultat comme Result<Person> au lieu du type de béton. Donc le résultat retourné par getTeachers() est sérialisé comme contenant un List<Person> au lieu de List<Teacher>, et le même pour getStudents(), mutatis mutandis.

Est-ce le comportement attendu? Dois-je utiliser @XmlSeeAlso sur Person?

Merci!

LES

+0

pouvez-vous donner un XML résultant? – Bozho

+0

J'utilise actuellement un plugin JAX-WS JSON qui retourne des données JSON. Un exemple d'exemple getTeachers serait: {city: "Memphis", groupe: [{name: "Johnny"}]}. Autrement dit, "salaire" n'apparaîtrait pas. La même chose pour getStudents - il aimerait exactement comme l'exemple précédent (cours ne serait pas apparaître). Je ne suis pas sur ma boîte de dev qui est pourquoi je ne peux pas poster un exemple réel du WSDL ou du schéma généré ou XML d'accéder au service via SOAP en utilisant SoapUI. – les2

Répondre

0

La réponse à celui-ci était plutôt difficile. Il s'avère que la version de jettison utilisée par le plugin jax-ws json est un peu ancienne (1.0-beta-1 IIRC). Cette version particulière ne gère pas bien cette affaire (elle plante). Si vous ajoutez le @XmlSeeAlso alors le marshalling JSON va planter! Bien sûr, ça craint!

J'ai lu sur un forum (ne pas avoir le lien - tout cela vient de la mémoire) que le plugin jax-ws json n'est pas maintenu activement. Si vous essayez d'exclure la dépendance jettison par défaut de la fonction json-ws json (en supposant ici maven) et d'ajouter une version plus récente, vous obtenez une erreur à propos de JSONException qui n'existe pas. Jax-ws json ne fonctionnera pas avec une version plus récente de jettison (j'ai essayé).

Ceci est documenté sur un autre site Web (quelqu'un a déclaré qu'il aimerait que quelqu'un transfère jax-ws json au dernier jettison). En fin de compte, je suis passé à DWR pour l'accès à distance. Il vaut mieux laisser JAX-WS pour l'intégration de système à système (backend). C'est trop lourd pour les choses frontales. DWR fonctionne AWESOMELY dans ce cas.

Lien trouvé vers le forum Je lis: http://forums.java.net/jive/thread.jspa?messageID=384385. Notez que Collab.net est actuellement en maintenance, mais il sera bientôt disponible.

Pour répondre à la question générale (sans le plugin JAX-WS JSON), la réponse est oui - vous devez utiliser l'annotation @XmlSeeAlso dans la classe Person. Sinon, le schéma ne contiendra que des éléments Personne et pas Maître ou Étudiant. Seuls les éléments définis dans Person sont gérés sans l'annotation @XmlSeeAlso.

+0

Je vois que cet article a deux ans. qu'est-ce que vous utilisez actuellement pour implémenter un WebMethod avec JSON? –

+1

Je pense que le jersey serait standard dans le vers java? (Si vous voulez des services reposants). spring mvc rend également cela trivial, ajoutez simplement des annotations ResponseBody sur les méthodes du contrôleur et spécifiez le type de contenu à application/json sur l'annotation RequestMapping. et parfois j'utilise des grails (même si je ne suis pas complètement gagné). – les2

Questions connexes