假设我有以下java类,它映射到REST服务的请求主体以搜索用户。
@XmlRootElement(name = "SearchParams")
@XmlType(propOrder = {})
public class SearchParams {
private String firstname;
private String lastname;
private List<String> role;
...
}
注意@XmlType注释的propOrder参数-它声明表示单个属性的顺序并不重要,因此在生成的XSD模式中应该使用xsd:all而不是xsd:sequence。
但是,如您所见,其中一个属性(角色属性)是一个列表,因此对应于一个具有无界maxOccurs的元素。
似乎在xsd:all complexType中不允许有一个具有无界maxOccurs的元素。如何避免这个问题?
注意,与角色不同,名和姓氏具有1的maxOccurs of 1。因此,我也不能使用un界xsd:selection而不是xsd:all。
发布于 2014-09-15 15:37:00
假设您仍然可以修改这个模型,您可以将角色列表包装成它自己的类型,这样您将得到一个<roles>
元素,其中包含一个<role>
的列表。
<SearchParams>
<firstname>firstname</firstname>
<lastname>lastname</lastname>
<roles>
<role>role</role>
</roles>
</SearchParams>
xsd只是
<xsd:schema ... >
<xsd:element name="SearchParams">
<xsd:complexType>
<xsd:all>
<xsd:element name="firstname" type="xsd:string" />
<xsd:element name="lastname" type="xsd:string" />
<xsd:element name="roles" type="Roles" />
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Roles">
<xsd:sequence>
<xsd:element name="role" type="xsd:string" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
你会有两门课。包含列表的Roles
类。海事组织,这是一种更清洁的方法。(您可以让Roles
匿名,但是这样您就会被一个静态的内部类困住了)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
})
@XmlRootElement(name = "SearchParams")
public class SearchParams {
@XmlElement(required = true)
protected String firstname;
@XmlElement(required = true)
protected String lastname;
@XmlElement(required = true)
protected Roles roles;
...
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Roles", propOrder = {
"role"
})
public class Roles {
@XmlElement(required = true)
protected List<String> role;
...
}
更新
“如果我能用这种方式更改模型类,这将是解决这个问题的一个很好的方法。不幸的是,我只能更改注释。”
你可以用@XmlList
。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
})
@XmlRootElement(name = "SearchParams")
public class SearchParams {
@XmlElement(required = true)
protected String firstname;
@XmlElement(required = true)
protected String lastname;
@XmlList
@XmlElement(required = true)
protected List<String> role;
...
}
xsd看起来就像
<xsd:element name="SearchParams">
<xsd:complexType>
<xsd:all>
<xsd:element name="firstname" type="xsd:string" />
<xsd:element name="lastname" type="xsd:string" />
<xsd:element name="role">
<xsd:simpleType>
<xsd:list itemType="xsd:string" />
</xsd:simpleType>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:element>
备注:如所指出的here,这种方法是“危险的”,我的文章开头的解决方案比使用字符串类型的list
更可取。但在你的具体情况下,我不确定我是否有别的办法
https://stackoverflow.com/questions/25850502
复制相似问题