2012-12-08 69 views
20
<xs:element name="age"> 
    <xs:simpleType> 
    <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="0"/> 
     <xs:maxInclusive value="120"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

所以我希望它會轉換爲Java代碼:JAXB是否支持xsd:restriction?

public void setAge(int age){ 
    if(age < 0 || age > 120){ 
     //throw some exception 
    } 
    //setting the age as it is a valid value 
} 

是否有可能在JAXB?

曾經看到過一些WebService的客戶端存根生成器這樣做也許Axis2的web服務,但不能確定。

回答

18

JAXB (JSR-222)規範不包括生成快速失敗邏輯到域模型。現在常見的做法是以批註(或XML)的形式表達驗證規則並對其進行驗證。 Bean Validation (JSR-303)對此進行了標準化,並且可用於任何Java EE 6實現。

XJC擴展

我還沒有試過以下擴展自己,但它看起來好像它會產生Bean Validation (JSR-303)註釋到從XML架構域模型表示的驗證規則。由於XJC具有很強的可擴展性,因此可能還有其他插件可用。

+1

謝謝,還有一件事。有一個[http://java.net/jira/browse/JAXB-917] JIRA爲JAXB小平面,這不包括在JSR爲JAXB。對?這是一些其他標準的標準實施嗎? –

+2

@NarendraPathai - 這是我第一次聽說過JAXB構面。目前這不是JSR的一部分,並且正在被提議作爲JAXB參考實現的增強。我發佈了關於JIRA問題的評論,詢問它是否與Bean驗證(JSR-303)兼容。 JAXB規範的未來版本可以支持JSR-303兼容方法。 –

+1

謝謝布萊斯。我關注你的博客,並希望瞭解JAXB中的一些實現。 –

4

執行此驗證在JAXB上編組RESP上模式驗證切換所建議的方法。解組:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(...); 

ValidationEventHandler valHandler = new ValidationEventHandler() { 
    public boolean handleEvent(ValidationEvent event) { 
     ... 
    } 
}; 

marshaller.setSchema(schema); 
marshaller.setEventHandler(valHandler); 
+0

我知道,但是,如果模式包含XSD:限制然後生成的代碼並不反映這些約束 –

+1

好,在JAXB標準和RI有沒有這樣的機制。我猜他們沒有被使用,因爲不是所有的模式約束都可以立即驗證(例如「minOccurs = 2」)。 – Drunix

+0

但正如我在問題已經提到已經看到了一些軸線的工具產生,其利用XS類:限制。 –

4

你可以試試JAXB-Facets。快速片段:

class MyClass { 

    @MinOccurs(1) @MaxOccurs(10) 
    @Facets(minInclusive=-100, maxInclusive=100) 
    public List<Integer> value; 

    @Facets(pattern="[a-z][a-z0-9]{0,4}") 
    public String name; 

}