JAXB и список разрешений Джерси? - PullRequest
2 голосов
/ 05 февраля 2010

У меня есть следующий XSD, определенный для создания некоторых объектов jaxb. Хорошо работает.

<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>

Я использую Spring RowMapper для отображения строк из моей базы данных в объекты Person. Итак, я в конечном итоге с объектом List , который является , а не объектом People. I Объект People имеет внутренний список .

Тогда в моем классе ресурсов Джерси у меня есть:

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

Возвращаемый XML-код:

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

У меня вопрос, как он делает отображение из списка на людей в XML. Кроме того, элементом является «Люди» (заглавная буква P), а не «люди» (строчная буква P). Похоже, он на самом деле не использует XSD вообще.

РЕДАКТИРОВАТЬ Это как-то связано с этим вопросом: Коллекции JAXB (Список ) Используйте Pascal Case вместо Camel Case для имен элементов

1 Ответ

3 голосов
/ 05 февраля 2010

Похоже, что он на самом деле не использует XSD вообще

Это потому, что это не так. JAXB использует схему только при генерации кода с использованием XJC; после этого он бесполезен, во время выполнения он использует только аннотации (он также может использовать его для проверки, но это здесь не актуально).

Ваш метод REST возвращает List<Person>, и Джерси делает все возможное, чтобы превратить это в XML, обернув его в <people>. Вы не сказали ему использовать класс-оболочку People, и он не может догадаться об этом сам.

Если вы хотите сгенерировать элемент оболочки <People>, вам нужно предоставить ему класс оболочки People:

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

    return people ;
}
...