2

我定义了以下 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<Person> 对象,它不是People 对象。I People 对象在内部有一个 List<Person> 。

然后在我的泽西资源类中,我有:

@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 中的 List<Person> 到 People 的。此外,元素是“人”(大写 P)而不是“人”(小写 P)。似乎它根本没有真正使用 XSD。

编辑这在某种程度上与这个问题有关:JAXB Collections (List<T>) Use Pascal Case instead of Camel Case for Element Names

4

1 回答 1

3

似乎根本没有真正使用 XSD

那是因为它没有。JAXB 仅在使用 XJC 生成代码时使用模式;之后它就没有用了,在运行时它只使用注释(它也可以用于验证,但这与这里无关)。

您的 REST 方法正在返回List<Person>,Jersey 正在尽最大努力将其转换为 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 ;
}
于 2010-02-05T08:18:30.647 回答