2010-02-03 20 views
14

Estoy trabajando en un servicio web Apache CXF (usando JAX-WS, sobre SOAP). El servicio en sí es bastante simple: recibir una solicitud, insertar la solicitud en una base de datos y devolver si la inserción fue exitosa. Me gustaría basarme en la validación XML para aplicar una serie de limitaciones a la solicitud.Validación XML del lado del servidor con el servicio web CXF

Entonces, mi pregunta. ¿Cómo devuelvo los errores de validación detallados a un cliente de mi servicio? He convertido la validación en el servidor configurando mi punto final.

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl"> 
    <jaxws:properties> 
     <!-- This entry should- ideally- enable JAXB validation 
     on the server-side of our web service. --> 
     <entry key="schema-validation-enabled" value="true" /> 
    </jaxws:properties> 
</jaxws:endpoint> 

He explorado el uso de interceptores (por ejemplo BareInInterceptor) en el servidor, y de alguna manera la captura SAXParseExceptions para envolverlos y enviarlos junto con el cliente. Este enfoque parece un poco complicado, pero de alguna manera tengo que darles a los clientes un número de línea si su XML no es válido. ¿Debo ir con los interceptores para exponer las excepciones?

No tengo mucha experiencia con esta pila de tecnología, y solo estoy ingresando a los servicios web, cualquier sugerencia que ustedes me puedan dar sería muy apreciada.

+2

Tenga en cuenta que si el XML de su solicitud está siendo generado por una aplicación cliente SOAP (como la que obtendría de la generación de stubs de su propio servicio), es probable que su número de línea sea 1 con frecuencia (ya que muchos los clientes simplemente generarán un documento XML de 1 línea muy larga). –

+0

@Ian McLaird: estos son comentarios válidos, por otro lado, cuando los probadores prueban la aplicación, usan un mejor formato y esto les ayudará a – Betlista

Respuesta

26

Puede anular los mensajes de error de validación, la inserción de un número de línea, mediante el uso de una costumbre ValidationEventHandler:

package example; 

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.helpers.DefaultValidationEventHandler; 

public class MyValidationEventHandler extends DefaultValidationEventHandler {  
    @Override 
    public boolean handleEvent(ValidationEvent event) { 
     if (event.getSeverity() == ValidationEvent.WARNING) { 
      return super.handleEvent(event); 
     } else { 
      throw new RuntimeException(event.getMessage() 
       + " [line:"+event.getLocator().getLineNumber()+"]"); 
     } 
    } 
} 

Si se configura el punto final a utilizar este controlador:

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl"> 
    <jaxws:properties> 
     <entry key="schema-validation-enabled" value="true" /> 
     <entry key="jaxb-validation-event-handler"> 
      <bean class="example.MyValidationEventHandler" /> 
     </entry> 
    </jaxws:properties> 
</jaxws:endpoint> 

por lo que recibirá Fallas de SOAP que se ven así:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
      <faultcode>soap:Client</faultcode> 
      <faultstring>Unmarshalling Error: Not a number: xyz [line: 6]</faultstring> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

El jaxb-validation-ev La propiedad ent-handler solo se agregó a CXF hace muy poco tiempo, por lo que debe asegurarse de estar utilizando la última versión. Probé esto con 2.2.5.

+0

¡Lo intentaré por la mañana! –

+0

Esto funciona genial, mar, la recompensa es tuya. –

+0

Parece que este enfoque no funciona correctamente para CXF 2.2.9. Esto aún devolverá el número de línea para el caso, cuando se especifique un valor de fecha incorrecto, pero el número de línea será incorrecto. Para otras excepciones, f.e. Restricción interrumpida para la longitud de la cadena, esto no agregará el número de línea, y se devolverá initil SAXParseException. Entonces, según tengo entendido, hay una sola forma: manejar fallas y reparar el documento, cuando se recibe SAXParseExceptions. – Milkywayfarer

Cuestiones relacionadas