我定义了以下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
答案 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 ;
}