2010-02-05 6 views
2

J'ai le XSD suivant défini pour générer des objets jaxb. Ça marche bien. J'utilise Spring RowMapper pour mapper les lignes de ma base de données en objets Person. Donc, je finis avec un objet Liste <Personne>, qui est pas un objet People. I objet personnes a une liste <personne> en interne.JAXB et Jersey liste résolution?

Puis dans ma classe de ressources Jersey J'ai:

@GET 
@Path("/TheListOfPeople") 
public List<Person> getListOfPeople() { 
    List<Person> list = dao.getList(); 
    return list; 
} 

Le XML qui est retourné est:

<?xml version="1.0" encoding="UTF-8" standalone="yes" > 
<people> 
    <Person>...</Person> 
    <Person>...</Person> 
    <Person>...</Person> 
    <Person>...</Person> 
</people> 

Ma question est comment est-il fait le mappage de la liste <personne> à Les gens dans le XML. En outre, l'élément est "People" (capital P) et non "people" (P en minuscule). On dirait que ça n'utilise pas vraiment le XSD du tout.

EDIT Ceci est en quelque sorte lié à cette question: JAXB Collections (List<T>) Use Pascal Case instead of Camel Case for Element Names

Répondre

3

On dirait que ce n'est pas vraiment en utilisant le XSD du tout

C'est parce qu'il ne fonctionne pas. JAXB utilise uniquement le schéma lors de la génération du code en utilisant XJC; après cela, il ne sert à rien, à l'exécution il n'utilise que les annotations (il peut aussi l'utiliser pour la validation, mais ce n'est pas pertinent ici). Votre méthode REST retourne List<Person>, et Jersey fait de son mieux pour transformer cela en XML, en l'enveloppant dans <people>. Vous ne lui avez pas dit d'utiliser la classe wrapper People, et il n'a aucun moyen de deviner cela pour lui-même.

Si vous voulez générer l'élément d'emballage <People>, alors vous devez donner la classe wrapper People:

@GET 
@Path("/TheListOfPeople") 
public People getListOfPeople() { 
    People people = new People(); 
    people.getPerson().addAll(dao.getList()); // or something like it 

    return people ; 
}