Подтвердить что ты не робот

Spring WS: Как получить и сохранить ошибки проверки XSD

Я использую SpringWS для моего мыльного сервиса и проверяю его следующим образом:

 <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)
{ ...}

Это прекрасно работает, но когда есть ошибка, он возвращает spring сгенерированный ответ об ошибке до того, как он достигнет конечной точки, поэтому у меня никогда не будет возможности их обработать. Но я хочу иметь возможность вести журнал и сохранять полное сообщение об ошибке в базе данных. Один из способов, которым я узнал, - сделать что-то подобное в моем другом вопросе;

Spring WS Как получить все сообщения об ошибках при завершении проверки

Но он не работает, как я хочу.

4b9b3361

Ответ 1

вы можете расширить PayloadValidationInterceptor и переопределить метод

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

Если вы посмотрите на стандартную реализацию (доступно здесь), вы можете увидеть, как она сбрасывает все ошибки синтаксического анализа; вы также можете сбросить входящее сообщение, так как у вас есть доступ к messageContext и его методу getRequest(). Ваш класс должен быть чем-то вроде

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);

}