如何在Spring WS中处理语法错误的XML?

时间:2013-11-12 08:47:41

标签: java spring web-services spring-mvc soap

我正在使用Spring WS编写Web服务。我必须记录所有请求和响应。如果消息在语法上是正确的,那么SoapEnvelopeLoggingInterceptor将记录日志。

不幸的是,某些对Web服务的请求可能在语法上不正确,例如:

<?xml version="1.0" encoding="UTF-8"?>
<Message>
    <foo>Hello, </foo>
    <!-- > symbol is missing: -->
    <bar>World!</bar
</Message>

当此消息发送到我的服务时,服务器拒绝接受它,说:“客户端发送的请求在语法上是不正确的。”

也许有人可以给我一个关于如何记录语法错误消息的提示?

2 个答案:

答案 0 :(得分:1)

无效的SOAP请求无法访问您的Web服务方法,但是当涉及到SOAP时,责任在于客户端发送有效请求。如果他们不这样做,他们的代码就会出现错误,而不是你的错误。

但是,如果您希望记录无效请求,那么您可以使用Log4J(或您已连接的任何日志记录框架)来执行此操作。如果您查看SoapEnvelopeLoggingInterceptor代码,您将看到它实现了SOAP错误的调试级日志记录。

https://github.com/spring-projects/spring-ws/blob/master/core/src/main/java/org/springframework/ws/soap/server/endpoint/interceptor/SoapEnvelopeLoggingInterceptor.java?source=cc

public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
    if (logFault && logger.isDebugEnabled()) {
        logMessageSource("Fault: ", getSource(messageContext.getResponse()));
    }
    return true;
}

因此,通过配置事件来记录自己文件中的SOAP错误,您可以对失败的请求进行某种审计。您甚至可以监视该文件,以便其中的任何条目都会导致警报。

<appender name="soapFaultAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/log/myapp/soap-faults.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %p [%c{3}] %m%n" />
    </layout>
</appender>
<appender name="async" class="org.apache.log4j.AsyncAppender">
    <param name="BufferSize" value="1024"/> 
    <appender-ref ref="soapFaultAppender"/>
</appender>
<logger name="org.springframework.ws.soap.server.endpoint.interceptor">
    <level value="debug" />
</logger>

答案 1 :(得分:0)

我会考虑在您的应用程序堆栈中放置一个过滤器来处理日志记录。我认为您已经失去了使用SoapEnvelopeLoggingInterceptor的能力,但是在您的应用程序确定它只对正确格式化的XML消息感兴趣之前,您将处理该消息。