2012-12-08 12 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> 

So will ich es Java-Code wie folgt umgewandelt werden:Unterstützt 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 
} 

Ist es möglich, in JAXB?

Hatte gesehen, einige WebService Client Stub-Generator tun dies vielleicht axis2 Webservice, aber nicht sicher.

Antwort

18

Die JAXB (JSR-222) Spezifikation bezieht sich nicht auf schnelle Logik in das Domänenmodell scheitern zu erzeugen. Eine gängige Praxis besteht nun darin, Validierungsregeln in Form von Annotationen (oder XML) auszudrücken und sie zu validieren. Bean Validation (JSR-303) standardisiert dies und ist in jeder Java EE 6-Implementierung verfügbar.

XJC Extensions

Ich habe folgende Erweiterung mich nicht versucht, aber es scheint, als ob es Bean Validation (JSR-303) Anmerkungen auf die Domänenmodell Darstellung Validierungsregeln aus dem XML-Schema zu generieren. Da XJC sehr erweiterbar ist, sind möglicherweise auch andere Plug-Ins verfügbar.

+1

Danke und es gibt noch eine Sache. Es gibt eine [http://java.net/jira/browse/JAXB-917] JIRA für JAXB Facetten, diese ist nicht in JSR für JAXB enthalten. Recht? Ist das eine Standard-Implementierung eines anderen Standards? –

+2

@NarendraPathai - Dies ist das erste Mal, dass ich von JAXB Facetten gehört habe. Dies ist derzeit nicht Teil des JSR und wird als Erweiterung der JAXB-Referenzimplementierung vorgeschlagen. Ich habe einen Kommentar zum JIRA-Problem geschrieben, in dem ich gefragt habe, ob es mit der Bean-Validierung (JSR-303) kompatibel ist. Ein JSR-303-kompatibler Ansatz wäre etwas, das in einer zukünftigen Version der JAXB-Spezifikation unterstützt werden könnte. –

+1

Danke Blaise. Ich folge Ihren Blogs und würde gerne etwas über die Implementierung in JAXB erfahren. –

4

Der vorgeschlagene Weg, diese Validierung in JAXB durchzuführen, besteht darin, die Schema-Validierung auf dem Marshaller bzw. auf dem Marshaller zu aktivieren. Unmarshaller:

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

Ich weiß aber, wenn das Schema XSD enthält: restriction dann der generierte Code entspricht nicht diese Einschränkungen –

+1

Ok, in JAXB Standard und RI gibt es keine solchen Mechanismen. Ich denke, sie werden nicht verwendet, da nicht alle Schema-Constraints sofort validiert werden können (zum Beispiel "minOccurs = 2"). – Drunix

+0

aber wie ich in der Frage erwähnt habe einige Achsen-Tools zu sehen, die Klassen, die Xs: Einschränkung verwenden. –

4

können Sie JAXB-Facets versuchen. Schnell Schnipsel:

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; 

} 
Verwandte Themen