我正在使用Spring WS编写Web服务。我必须记录所有请求和响应。如果消息在语法上是正确的,那么SoapEnvelopeLoggingInterceptor将记录日志。
不幸的是,某些对Web服务的请求可能在语法上不正确,例如:
<?xml version="1.0" encoding="UTF-8"?>
<Message>
<foo>Hello, </foo>
<!-- > symbol is missing: -->
<bar>World!</bar
</Message>
当此消息发送到我的服务时,服务器拒绝接受它,说:“客户端发送的请求在语法上是不正确的。”
也许有人可以给我一个关于如何记录语法错误消息的提示?
答案 0 :(得分:1)
无效的SOAP请求无法访问您的Web服务方法,但是当涉及到SOAP时,责任在于客户端发送有效请求。如果他们不这样做,他们的代码就会出现错误,而不是你的错误。
但是,如果您希望记录无效请求,那么您可以使用Log4J(或您已连接的任何日志记录框架)来执行此操作。如果您查看SoapEnvelopeLoggingInterceptor代码,您将看到它实现了SOAP错误的调试级日志记录。
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消息感兴趣之前,您将处理该消息。