Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

178
Vistas
Validación de Jaxb contra el esquema con solo tipos complejos

Tengo un wsdl que contiene elementos de solicitud y respuesta:

 <xsd:element name="someRequest" type="ns:SomeRequest"/> <xsd:element name="someResponse" type="ns:SomeResponse"/>

Este wsdl importa algunos xsd, que contienen, entre otros, estos tipos complejos:

 <xsd:complexType name="SomeRequest"> ... </xsd:complexType> <xsd:complexType name="SomeResponse"> ... </xsd:complexType>

Quiero validar un xml contra este wsdl, pero no puedo hacerlo funcionar. Básicamente estoy usando el método descrito en http://actimem.com/java/jaxb-validation/#Marshalling_Validation , ordenando el objeto y configurando un esquema y un controlador de eventos.

Si configuro el esquema en el xsd, no se validará porque no hay ningún elemento en el xsd. Esto es bastante lógico, obtengo lo mismo con otras herramientas. Cuando uso wsdl como esquema, aparece este error debido a la documentación en línea:

 s4s-elt-character: Non-whitespace characters are not allowed in schema elements other than 'xs:appinfo' and 'xs:documentation'.

¿Hay alguna forma de hacer que esto se valide?

Como estoy trabajando en proyectos existentes (actualmente usando Xmlbeans en lugar de JAXB) con un flujo de trabajo establecido, tengo que trabajar con algunas restricciones:

  • Estos esquemas no los creamos nosotros y no se pueden editar, por lo que eliminar los documentos o agregar los elementos no es una opción.
  • Preferiría cargar los xsd desde 1 lugar debido a la duplicación y posibles errores humanos. Los Xsd se almacenan en un proyecto separado, que crea archivos jar que incluimos como dependencias en nuestros proyectos. Los jar que contienen las clases generadas por xjc también contienen los esquemas.
  • Los xsd contienen muchas importaciones.
  • Debido a las colisiones de espacio de nombres y carga de clases, no puedo usar ObjectFactory generado por xjc. Múltiples xsd tienen el mismo espacio de nombres pero en realidad son diferentes, y esto ha causado problemas con la carga de ObjectFactory incorrecta en proyectos genéricos que usan múltiples xsd.

Intenté transformar el esquema para agregar el elemento manualmente, pero no puedo encontrar la manera de hacerlo en un objeto de esquema existente. Si hago esto a través de la manipulación DOM, obtengo el nuevo esquema como un objeto String, que no se analizará en un esquema porque no se pueden encontrar los xsd importados.

Si copio los xsd del jar al proyecto, puedo transformarlos y obtener la validación para tener éxito, pero realmente no me gusta esta solución. Si no hay otra forma, volveré a eso, pero me gustaría encontrar una solución que requiera el menor trabajo posible al reutilizar este método y que sea menos propensa a errores. Otros desarrolladores usarán este código y 1 método de validación sin necesidad de pasos adicionales para funcionar sería perfecto.

Me encontré básicamente con este problema antes y tampoco encontré una solución. Pero antes, complexType no era el elemento raíz y podía envolverlo en otros objetos hasta que encontraba un objeto que estaba representado como elemento en el xsd.

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Puede considerar mirar la clase javax.xml.validation.Validator . Hay una manera de crearlo para el esquema en el documento WSDL y luego tendrá su elemento someRequest que puede validar contra ese esquema.

el código puede parecerse a:

 import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.ErrorHandler; ... DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); String testXml = "{your XML document}" Document domDoc = docBuilder.parse(new ByteArrayInputStream(testXml.getBytes())); Source inputSource = new DOMSource(domDoc); Validator validator = requestedSchema.newValidator(); MySchemaValidationErrorHandler errHandler = new MySchemaValidationErrorHandler(); SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema requestedSchema = schemaFactory.newSchema({DOMSource from WSDL document/types/xsd:schema node})); validator.setErrorHandler(errHandler); validator.validate(inputSource);

Tenga en cuenta que debe tener su propia implementación de la interfaz org.xml.sax.ErrorHandler donde se recopilarán todas las advertencias y errores durante la validación.

En general, no es difícil hacer todo eso. Solo necesitas

  1. tener Schema Source de WSDL necesita definiciones/tipos/xsd:schema Node. es factible a través de DOMSource
  2. Páselo como parámetro de esquema cuando cree un objeto de esquema a partir del schemaFactory.newSchema(...)
  3. Implemente la interfaz org.xml.sax.ErrorHandler donde se recopilan todos los errores. Es muy simple
  4. Maneje esos errores directamente desde el controlador o recójalos y trátelos después de que el validador complete su trabajo. Es tu decision...

PD. Por lo general, creo los esquemas necesarios una vez y los guardo en el mapa. Solo tenga en cuenta: el validador no es seguro para subprocesos.

por supuesto, puede usar cualquier otra implementación de javax.xml.transform.Source , no solo DOMSource

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda