首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JAXB -在xsd:all中具有无界maxOccurs的元素

JAXB -在xsd:all中具有无界maxOccurs的元素
EN

Stack Overflow用户
提问于 2014-09-15 14:33:50
回答 1查看 4.1K关注 0票数 4

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

代码语言:javascript
运行
复制
@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的元素。如何避免这个问题?

注意,与角色不同,姓氏具有1maxOccurs of 1。因此,我也不能使用un界xsd:selection而不是xsd:all

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-15 15:37:00

假设您仍然可以修改这个模型,您可以将角色列表包装成它自己的类型,这样您将得到一个<roles>元素,其中包含一个<role>的列表。

代码语言:javascript
运行
复制
<SearchParams>
    <firstname>firstname</firstname>
    <lastname>lastname</lastname>
    <roles>
        <role>role</role>
    </roles>
</SearchParams>

xsd只是

代码语言:javascript
运行
复制
<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匿名,但是这样您就会被一个静态的内部类困住了)

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@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看起来就像

代码语言:javascript
运行
复制
<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更可取。但在你的具体情况下,我不确定我是否有别的办法

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25850502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档