Resolução lista JAXB e Jersey?
Pergunta
Eu tenho o seguinte XSD definido para gerar alguns objetos JAXB. Ele funciona bem.
<xsd:element name="Person" type="Person" />
<xsd:complexType name="Person">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int" />
<xsd:element name="firstName" type="xsd:string" />
<xsd:element name="lastName" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="People">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Person" minOccurs="0" maxOccurs="unbounded"
type="Person" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Eu uso Primavera RowMapper para mapear as linhas do meu banco de dados em objetos Person. Então, eu acabar
com um List
Então, em minha classe de recurso Jersey eu tenho:
@GET
@Path("/TheListOfPeople")
public List<Person> getListOfPeople() {
List<Person> list = dao.getList();
return list;
}
O XML que é retornado é:
<?xml version="1.0" encoding="UTF-8" standalone="yes" >
<people>
<Person>...</Person>
<Person>...</Person>
<Person>...</Person>
<Person>...</Person>
</people>
A minha pergunta é como é que é fazer o mapeamento para a partir de List
Editar Isto é de alguma forma relacionado a esta pergunta: JAXB Colecções Use Case Pascal (List
Solução
Parece que ele não está realmente usando o XSD em tudo
Isso porque isso não acontece. JAXB só usa o esquema quando gerado o código usando XJC; depois que ele não tem nenhum uso para ele, em tempo de execução que utiliza apenas as anotações (que também pode usá-lo para validação, mas isso não é relevante aqui).
Seu método REST está retornando List<Person>
e Jersey está fazendo o seu melhor para transformar isso em XML, por envolvê-lo em <people>
. Você não disse que usar o People
invólucro de classe, e não tem como adivinhar que por si.
Se você deseja gerar o elemento <People>
invólucro, então você precisa dar-lhe a classe People
fardos:
@GET
@Path("/TheListOfPeople")
public People getListOfPeople() {
People people = new People();
people.getPerson().addAll(dao.getList()); // or something like it
return people ;
}