如何解决JAXB-在xsd:all内部具有不受限制的maxOccur的元素
假设您仍然可以修改此模型,则可以将角色列表包装为自己的类型,因此最终得到一个<roles>
带有<role>
s 列表的元素
<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>
如前所述
,这种方法是一种“危险的”,我在文章的开头的解决方案优于使用list
字符串类型的。但在您的特定情况下,不确定我是否看到另一种方式
解决方法
假设我有以下java类,它映射到我的REST服务的请求主体以搜索用户。
@XmlRootElement(name = "SearchParams")
@XmlType(propOrder = {})
public class SearchParams {
private String firstname;
private String lastname;
private List<String> role;
...
}
注意 @XmlType* 批注的 propOrder 参数-它声明表示单个属性在XML文件中出现的顺序无关紧要,因此在生成的XSD模式中应使用
xsd:all 而不是 xsd:sequence 。 *
但是,如您所见,属性之一( 角色 属性)是一个列表,因此对应于具有 无界maxOccurs 的元素。
似乎在 xsd:all complexType中* 不允许具有 maxOccurs无限制 的元素。如何避免这个问题? *
需要注意的是,不同的角色,将 名字 和 姓氏 具有 的maxOccurs 的 1 。因此,我不能使用
无限制的xsd:choice 而不是 xsd:all 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。