2011-11-04 11 views
12

Escribo un EJB como primer servicio SOAP y genero las clases java y SEI del WSDL. El WSDL especifica varios tipos con restricciones (longitud máxima, patrón, etc.). Las clases java generadas son JAXB anotadas pero carecen de los metadatos de contraints porque las anotaciones JAXB no son compatibles. Esto significa que la validación de entrada solo se produce cuando se llama al servicio a través del punto final SOAP.¿Cómo puedo generar objetos Java con anotaciones de Validación de Frijol de un XSD?

El problema es que cuando EJB es llamado por otro EJB, la validación se pasa por alto ya que está ubicada en la pila XML. Me gustaría desactivar XML Schemavalidation y usar Bean Validation en su lugar para que la validación funcione para ambas formas (SOAP y RMI) de llamar al EJB.

Pregunta: ¿Cómo puedo generar no solo anotaciones JAXB sino también anotaciones de Validación de frijoles en las clases de Java?

Respuesta

4

La mejor respuesta que sé hasta ahora es usar el Annotate Plugin para agregar anotaciones JSR 303.

+0

Eso es ciertamente un puntero interesante. Gracias. –

6

Puede usar las API javax.xml.valdation para validar un modelo de dominio mapeado con JAXB en un esquema XML. Una ventaja de este enfoque es que se utilizan las mismas reglas de validación (definidos en el esquema XML) para los dos casos de 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); 
    } 

} 

Ejemplo completo

+0

¿Y si quiero mostrar buenos mensajes de validación al usuario? Bean Validation devolvería los útiles objetos 'ConstraintViolation', pero el Validator XML parece estar contento con devolver una simple cadena con una descripción presumiblemente muy técnica del error. – meriton

2

Puede usar MOXy versión 2.6+ como proveedor JAXB y esto se hará automáticamente. MOXy es un módulo de marco en el proyecto EclipseLink.

Por el momento, no es la versión 2.6.0-M3 de EclipseLink disponible en: sonatype o maven.

Cuestiones relacionadas