当前位置: 首页 > 知识库问答 >
问题:

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

庾波光
2023-03-14
@XmlRootElement(name = "SearchParams")
@XmlType(propOrder = {})
public class SearchParams {

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

  ...
}

共有1个答案

慕逸仙
2023-03-14

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

<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>

注意:正如这里提到的,这种方法是“危险的”,我的文章开头的解决方案比使用字符串类型的列表更好。但在你的具体情况下,不确定我是否看到了另一种方式

 类似资料:
  • 问题内容: 假设我有以下java类,它映射到我的REST服务的请求主体以搜索用户。 注意 @XmlType* 批注的 propOrder 参数-它声明表示单个属性在XML文件中出现的顺序无关紧要,因此在生成的XSD模式中应使用 xsd:all 而不是 xsd:sequence 。 * 但是,如您所见,属性之一( 角色 属性)是一个列表,因此对应于具有 无界maxOccurs 的元素。 似乎在 xs

  • 当我从注释中删除type=integer.class时,我开始在XML中得到maxOccurs=“unbounded”。 @XmlElement(required=true): 但我需要这种类型特别用于基元数据类型。如果注释中没有类型,则不需要的元素(即未设置required=true)缺少minOccurs=1。 有人能帮我吗?

  • 在解组xml文档时,JAXB无法解组具有替换组名称的复杂类型。doucment带有替换名,JAXB解组进程无法将数据与实际元素绑定。最后,我得到一个空对象,它的数据到达xml文档中。这是JAXB中的错误还是我在这里做错了什么? 注意:下面的模式清楚地定义了有问题的复杂元素类型ENBFunction的替代名称。并且在解编组"xn: ManagedElementOptionallyContainedN

  • 问题内容: 我有一个无法控制其生成方式的XML。我想通过将其分解为我手工编写的类来创建一个对象。 其结构的一个片段如下所示: 我该如何处理这种情况?当然,元素数是可变的。 问题答案: 如果使用以下对象模型,则每个未映射的key_#元素都将保留为org.w3c.dom.Element的实例: 如果任何元素对应于使用@XmlRootElement批注映射的类,则可以使用@XmlAnyElement(l

  • 我得到以下错误: 我尝试了以下几种方式,

  • 如何使用JAXB生成以下结构?在我的例子中,我有一个动态属性列表,它可能有3种类型:整数、字符串或列表。但是,列表属性具有嵌套元素。我怎样才能做到这一点?