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 objeto, que é não um objecto Pessoas. Eu Pessoas objeto tem um List internamente.

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 para Pessoas no XML. Além disso, o elemento é "Pessoas" (capital P) não "pessoas" (em minúsculas P). Parece que ele não está realmente usando o XSD em tudo.

Editar Isto é de alguma forma relacionado a esta pergunta: JAXB Colecções Use Case Pascal (List ) em vez de Camel Case for Nomes de Elementos

Foi útil?

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 ;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top