JAXB和泽西列表的分辨率?

时间:2010-02-05 02:49:24

标签: java spring jaxb jersey

我定义了以下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对象。所以,我最终了 列表&lt; Person&gt;对象,一个People对象。 I People对象有一个List&lt; Person&gt;内部。

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

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

我的问题是如何从List&lt; Person&gt;进行映射? XML中的人。此外,元素是“人”(大写P)而不是“人”(小写P)。好像它根本没有真正使用XSD。

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

1 个答案:

答案 0 :(得分: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 ;
}