2013-02-26 42 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