【问题标题】:test if JAXB generated field is required测试是否需要 JAXB 生成的字段
【发布时间】:2013-02-12 10:00:34
【问题描述】:

我有一个 JAXB 生成的 PersonType 类,其中包含属性名称、电话、地址。在 XSD 中,我定义了“电话”minoccurs="1"。 如果 XSD 中是否需要属性“phone”,我如何以编程方式(即通过反射等)在 Java 代码中进行测试?

后期编辑: JAXB 生成器创建一个没有任何“必需”等属性的类。所以类上没有注释,或者它的字段表明它是否需要。但是,在指定 XSD 等效元素的字段上有 @XmlElement 注释。所以我想唯一的解决方案是检查这个注释,然后针对 XSD 创建一个 XPath 或其他东西?

谢谢!

【问题讨论】:

  • 您想测试该类是否包含@XmlElement(required=true),或者您想测试该类的实例是否具有require name 元素?
  • @BlaiseDoughan 我需要一种方法来测试 XSD 端是否需要该字段。在 Java 生成的类中,没有任何迹象表明这一点。谢谢!

标签: xsd jaxb


【解决方案1】:

@XmlElement 注释有一个 required 属性(默认为 false),用于指示需要 XML 元素(minOccurs > 0)。您可以使用java.lang.reflect API 从类中获取此值。

XML 架构

在下面的 XML 架构中,foo 元素是必需的,bar 元素不是。

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <complexType name="root">
        <sequence>
            <element name="foo" type="string"/>
            <element name="bar" type="string" minOccurs="0"/>
        </sequence>
    </complexType>

</schema>

生成的类

下面是从 XML 模式生成的类。我们看到foo 字段用@XmlElement(required=true) 注释,而bar 字段没有。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "root", propOrder = {
    "foo",
    "bar"
})
public class Root {

    @XmlElement(required = true)
    protected String foo;

    protected String bar;

}

【讨论】:

  • 谢谢!这是一个很好的解决方案,但是如果这些字段是基类型限制的一部分,JAXB 不会为“扩展”类型生成任何元数据。这些字段仅在基本类型中定义(在 Java 代码中)。
  • @leadgy - 您也可以使用反射来检查继承的字段/属性。您还可以获取 classes 超类并直接对其进行检查。
  • 只是如果从父类型进行限制,子类型中设置的限制不会出现在生成的Java代码中。所以我不确定反射怎么可能。谢谢!
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多