2013-02-26 44 views
1

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

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

谢谢!

+0

想要测试该类是否包含“@XmlElement(required = true)”,或者您想测试该类的实例是否具有require'name'元素? – 2013-02-26 19:47:17

+0

http://www.mkyong.com/java/jaxb-hello-world-example/# – 2013-02-26 20:00:55

+0

@BlaiseDoughan我需要一种方法来测试该字段是否需要或不在XSD端。在Java生成的类中,没有任何迹象表明。谢谢! – 2013-02-27 09:04:57

回答

1

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

XML模式

foo元件下方的XML模式是必需的,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; 

} 
+0

谢谢!这是一个很好的解决方案,但是如果这些字段是基本类型限制的一部分,那么JAXB不会为“扩展”类型生成任何元数据。这些字段仅在基本类型中定义(在Java代码中)。 – 2013-02-28 10:04:29

+0

@leadgy - 您也可以使用反射检查继承的字段/属性。您也可以获得班级超级班,并直接进行检查。 – 2013-02-28 11:33:08

+0

只是,如果您限制父类型,则在生成的Java代码中不会显示在子类型中设置的限制。所以我不确定如何反思。谢谢! – 2013-02-28 15:36:18