java – JAXB – 在xsd:all中具有无界maxOccurs的元素
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JAXB – 在xsd:all中具有无界maxOccurs的元素,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2843字,纯文字阅读大概需要5分钟。
内容图文
![java – JAXB – 在xsd:all中具有无界maxOccurs的元素](/upload/InfoBanner/zyjiaocheng/808/f25a5003b2174667b3238fb626c393a1.jpg)
假设我有以下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的元素.我该如何避免这个问题?
请注意,与role不同,firstname和lastname的maxOccurs为1.因此,我不能使用无界xsd:choice而不是xsd:all.
解决方法:
假设您仍然可以修改此模型,您可以将角色列表包装在自己的类型中,这样您最终会得到一个< 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类. IMO,这是一种更清洁的方法. (你可以让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;
...
}
UPDATE
“If I could change the model class this way than this would look like a great way to solve this issue. Unfortunately I am only allowed to change the annotations”
你可以使用@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所述,这种方法是“危险的”,我的帖子开头的解决方案比使用字符串类型列表更受欢迎.但在你的具体情况下,不确定我是否看到了另一种方式
内容总结
以上是互联网集市为您收集整理的java – JAXB – 在xsd:all中具有无界maxOccurs的元素全部内容,希望文章能够帮你解决java – JAXB – 在xsd:all中具有无界maxOccurs的元素所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。