Java JAXB-在xsd:all中出现一个maxbounded为无界的元素

Java JAXB-在xsd:all中出现一个maxbounded为无界的元素,java,xml,jaxb,xsd,Java,Xml,Jaxb,Xsd,假设我有以下java类映射到REST服务的请求主体以搜索用户 @XmlRootElement(name = "SearchParams") @XmlType(propOrder = {}) public class SearchParams { private String firstname; private String lastname; private List<String> role; ... } @XmlRootElement(name=“Sear

假设我有以下java类映射到REST服务的请求主体以搜索用户

@XmlRootElement(name = "SearchParams")
@XmlType(propOrder = {})
public class SearchParams {

  private String firstname;
  private String lastname;
  private List<String> role;

  ...
}
@XmlRootElement(name=“SearchParams”)
@XmlType(propOrder={})
公共类SearchParams{
私有字符串名;
私有字符串lastname;
私人名单角色;
...
}
请注意@XmlType注释的proporter参数-它声明表示单个属性在XML文件中出现的顺序并不重要,因此在生成的xsd模式中应使用xsd:all而不是xsd:sequence

但是,正如您所看到的,其中一个属性(角色属性)是一个列表,因此对应于具有无限maxOccurs的元素

似乎在xsd:all complexType中不允许具有无界maxOccurs的元素。我如何避免这个问题


请注意,与角色不同,firstnamelastname具有maxOccurs1。因此,我不能使用无限xsd:choice而不是xsd:all

假设您仍然可以修改此模型,您可以将角色列表包装为其自己的类型,这样您将得到一个
元素和一个
的列表

<SearchParams>
    <firstname>firstname</firstname>
    <lastname>lastname</lastname>
    <roles>
        <role>role</role>
    </roles>
</SearchParams>

更新


“如果我能以这种方式更改模型类,那么这看起来是解决此问题的一个很好的方法。不幸的是,我只能更改注释”

你可以用

@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=),比例={
})
@XmlRootElement(name=“SearchParams”)
公共类SearchParams{
@XmlElement(必需=true)
受保护的字符串名;
@XmlElement(必需=true)
受保护的字符串lastname;
@XML列表
@XmlElement(必需=true)
受保护列表角色;
...
}
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>


注意:如前所述,这种方法是一种“危险”的方法,我的文章开头的解决方案比使用字符串类型的
列表更可取。但是在您的特定情况下,不确定我是否看到了另一种方法

如果我可以这样更改模型类,那么这看起来是解决此问题的一种很好的方法。不幸的是,我只能更改注释。@DušanRychnovský查看我的更新
@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;
    ...
}
@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: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>