2015-06-05 8 views
12

Uso SpringWS per il mio servizio soap e lo convalido in questo modo;Spring WS: Come ottenere e salvare gli errori di convalida XSD

<sws:interceptors> 
    <bean id="payloadValidatingInterceptor" class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor"> 
     <property name="schema" value="/schemas/my.xsd"/> 
     <property name="validateRequest" value="false"/> 
     <property name="validateResponse" value="true"/> 
    </bean> 

@PayloadRoot(namespace = NAMESPACE, localPart = "ServiceProvider") 
@ResponsePayload 
public ServiceProviderTxn getAccountDetails(@RequestPayload ServiceProviderrequest) 
{ ...} 

Questo funziona bene, ma quando c'è un errore che restituisce una molla generato risposta di errore prima che raggiunga il punto finale, quindi non ho mai avuto la possibilità di elaborarli. Ma voglio essere in grado di registrare e salvare il messaggio di errore completo nel database. Un modo in cui ho scoperto è di fare qualcosa di simile nella mia altra domanda;

Spring WS How to get all error messages when validation fails

Ma non funziona come voglio.

risposta

7

è possibile estendere PayloadValidationInterceptor e ridefinire il metodo

protected boolean handleRequestValidationErrors(MessageContext messageContext, SAXParseException[] errors) 

Se si guarda alla implementazione standard (disponibile here) si può vedere come si fa uscire tutti gli errori di analisi; puoi anche scaricare il messaggio in arrivo poiché hai accesso a messageContext e al suo metodo getRequest(). La tua classe dovrebbe essere qualcosa come

public class PayloadValidationgInterceptorCustom extends 
PayloadValidatingInterceptor { 

@Override 
protected boolean handleRequestValidationErrors(MessageContext messageContext, SAXParseException[] errors) 
     throws TransformerException { 
    messageContext.getRequest().writeTo(/*place your Outputstream here something like a ByteArrayOutputStream*/); //use this if you want to dump the message 
    for (SAXParseException error : errors) { 
     //dump the each error on the db o collect the stack traces in a single string and dump only one or to the database 
     /*you can use something like this 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     error.printStackTrace(pw); 
     sw.toString(); 
     to get the stack trace 
     */ 

    } 
    return super.handleRequestValidationErrors(messageContext,errors); 

} 
+1

tnx ma potresti estendere la risposta con il codice e combinare con la risposta che ho descritto sul mio collegamento? Sembra più una teoria piuttosto che una soluzione di lavoro – Spring

+1

@Spring: aggiunta una classe di esempio – Giovanni

+0

Ho provato ma handleRequestValidationErrors non viene mai chiamata – Spring

Problemi correlati