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

quindi voglio per ottenere convertito in codice Java come questo:JAXB supporta xsd: restrizione?

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

E 'possibile in JAXB?

Si era visto qualche generatore di stub client WebService che stava facendo questo servizio web asse2 ma non è sicuro.

risposta

18

La specifica JAXB (JSR-222) non copre la generazione di sicuro logica veloce nel modello di dominio. Una pratica comune ora è esprimere le regole di convalida sotto forma di annotazioni (o XML) ed eseguire la convalida su di esse. Bean Validation (JSR-303) standardizza questo ed è disponibile in qualsiasi implementazione Java EE 6.

XJC estensioni

Non ho provato la seguente estensione me stesso, ma sembra come se si genererà Bean Validation (JSR-303) annotazioni sul modello del dominio regole di convalida rappresentazione dallo schema XML. Poiché XJC è molto estendibile, potrebbero essere disponibili anche altri plug-in.

+1

Grazie e c'è ancora una cosa. C'è un [http://java.net/jira/browse/JAXB-917] JIRA per JAXB Facets, questo non è incluso in JSR per JAXB. Destra? Questa è una implementazione standard di qualche altro standard? –

+2

@NarendraPathai - Questo è il primo che ho sentito di JAXB Facets. Al momento non fa parte del JSR e viene proposto come miglioramento dell'implementazione di riferimento JAXB. Ho pubblicato un commento sul problema JIRA chiedendo la sua compatibilità con Bean Validation (JSR-303). Un approccio compatibile con JSR-303 potrebbe essere supportato in una versione futura delle specifiche JAXB. –

+1

Grazie Blaise. Seguo il tuo blog e mi piacerebbe sentire qualche implementazione di questo in JAXB. –

4

Il modo suggerito per eseguire questa convalida in JAXB è l'attivazione della convalida dello schema sul marshaller risp. 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

lo so, ma se lo schema contiene xsd: restrizione poi il codice generato non riflette tali vincoli –

+1

Ok, nella norma JAXB e RI non ci sono tali meccanismi. Suppongo che non vengano utilizzati poiché non tutti i vincoli dello schema possono essere convalidati immediatamente (ad esempio "minOccurs = 2"). – Drunix

+0

ma come ho accennato nella domanda ho visto alcuni strumenti di assi che generano classi che utilizzano xs: restriction. –

4

Si può provare JAXB-Facets. frammento di rapida:

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; 

} 
Problemi correlati