2011-11-04 14 views
12

Scrivo un EJB come primo contratto di servizio SOAP e creo le classi java e SEI dal WSDL. WSDL specifica diversi tipi con vincoli (lunghezza massima, modello, ecc.). Le classi java generate sono annotate JAXB ma mancano i metadati dei vincoli perché le annotazioni JAXB non supportano quelle. Ciò significa che la convalida dell'input si verifica solo quando il servizio viene richiamato tramite l'endpoint SOAP.Come posso generare oggetti Java con annotazioni di convalida dei bean da un XSD?

Il problema è che quando l'EJB viene chiamato da un altro EJB, la convalida viene ignorata poiché si trova nello stack XML. Vorrei disabilitare XML Schemavalidation e usare Bean Validation, invece la convalida funziona in entrambi i modi (SOAP e RMI) di chiamata all'EJB.

Domanda: Come posso generare non solo annotazioni JAXB ma anche annotazioni di convalida Bean nelle classi Java?

risposta

4

La migliore risposta che conosco finora è utilizzare Annotate Plugin per aggiungere annotazioni JSR 303.

+0

Questo è sicuramente un puntatore interessante. Grazie. –

6

È possibile utilizzare le API javax.xml.valdation per convalidare un modello di dominio mappato con JAXB rispetto a uno schema XML. Un vantaggio di questo approccio è che si utilizzano le stesse regole di validazione (definiti nello schema XML) per entrambi i vostri casi d'uso:

import java.io.File; 
import javax.xml.XMLConstants; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.util.JAXBSource; 
import javax.xml.validation.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Customer customer = new Customer(); 
     customer.setName("Jane Doe"); 
     customer.getPhoneNumbers().add(new PhoneNumber()); 
     customer.getPhoneNumbers().add(new PhoneNumber()); 
     customer.getPhoneNumbers().add(new PhoneNumber()); 

     JAXBContext jc = JAXBContext.newInstance(Customer.class); 
     JAXBSource source = new JAXBSource(jc, customer); 

     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = sf.newSchema(new File("customer.xsd")); 

     Validator validator = schema.newValidator(); 
     validator.setErrorHandler(new MyErrorHandler()); 
     validator.validate(source); 
    } 

} 

completa Esempio

+0

E se voglio mostrare dei buoni messaggi di convalida all'utente? Bean Validation restituirebbe gli utili oggetti 'ConstraintViolation', ma il Validator XML sembra essere contento di restituire una semplice stringa con una descrizione presumibilmente molto tecnica dell'errore? – meriton

2

È possibile utilizzare MOXy versione 2.6+ come provider JAXB e ciò verrà eseguito automaticamente. MOXy è un modulo framework nel progetto EclipseLink.

Al momento, non v'è la versione 2.6.0-M3 di EclipseLink disponibili presso: sonatype o maven.

Problemi correlati