假设我有以下java类映射到我的REST服务的请求主体以搜索用户.
@XmlRootElement(name = "SearchParams")
@XmlType(propOrder = {})
public class SearchParams {
private String firstname;
private String lastname;
private List<String> role;
...
}
Run Code Online (Sandbox Code Playgroud)
注意propOrder的参数@XmlType注解-它宣称,在代表各自的属性出现在XML文件中的顺序并不重要,因此是XSD:所有应该被用来代替XSD:序列中生成的XSD架构.
但是,正如您所看到的,其中一个属性(角色属性)是一个列表,因此对应一个具有无界maxOccurs的元素.
似乎在xsd:all complexType中不允许具有无界maxOccurs的元素.我该如何避免这个问题?
需要注意的是,不同的角色,将名字和姓氏具有的maxOccurs的1.因此,我不能使用无界的xsd:choice而不是xsd:all.
假设您仍然可以修改此模型,您可以将角色列表包装在自己的类型中,这样您最终会得到一个<roles>带有<role>s 列表的元素
<SearchParams>
<firstname>firstname</firstname>
<lastname>lastname</lastname>
<roles>
<role>role</role>
</roles>
</SearchParams>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
你有两节课.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;
...
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
"如果我可以通过这种方式更改模型类,那么这将是解决此问题的好方法.不幸的是,我只能更改注释"
你可以用@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;
...
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
注:如前所述这里,这种方法是一种"危险的",我在文章的开头的解决方案优于使用list字符串类型的.但在你的具体情况下,不确定我是否看到了另一种方式