Convalida XML lato server con Webservice CXF

Sto lavorando su un webservice Apache CXF (usando JAX-WS, su SOAP). Il servizio stesso è piuttosto semplice: ricevere una richiesta, inserire la richiesta in un database e restituire se l’inserimento ha avuto successo. Mi piacerebbe fare affidamento sulla convalida XML per far rispettare una serie di vincoli sulla richiesta.

Quindi, la mia domanda. Come posso restituire errori di convalida dettagliati a un cliente del mio servizio? Ho triggersto la convalida sul lato server configurando il mio endpoint.

      

Ho esplorato l’utilizzo di intercettori (ad esempio BareInInterceptor) sul server e in qualche modo catturando SAXParseExceptions per avvolgerli e inviarli al client. Questo approccio sembra un po ‘complicato, ma ho bisogno di dare in qualche modo ai client un numero di riga se il loro XML non è valido. Devo andare con gli intercettori per esporre le eccezioni?

Non ho molta esperienza con questo stack tecnologico e, entrando nei servizi web, qualsiasi suggerimento che voi ragazzi potete darmi sarebbe molto apprezzato.

È ansible ignorare i messaggi di errore di convalida, inserendo un numero di riga, utilizzando un ValidationEventHandler personalizzato:

 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()+"]"); } } } 

Se si configura il proprio endpoint per utilizzare questo gestore:

         

Quindi otterrai degli errori SOAP che assomigliano a questo:

    soap:Client Unmarshalling Error: Not a number: xyz [line: 6]    

La proprietà jaxb-validation-event-handler è stata aggiunta a CXF abbastanza recentemente, quindi è necessario assicurarsi che si stia utilizzando l’ultima versione: l’ho testato con 2.2.5.