【问题标题】:How to handle syntactically incorrect XMLs in Spring WS?如何在 Spring WS 中处理语法错误的 XML?
【发布时间】:2013-11-12 08:47:41
【问题描述】:

我正在使用 Spring WS 编写 Web 服务。我必须记录所有请求和响应。如果消息语法正确,则由SoapEnvelopeLoggingInterceptor 处理日志记录。

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

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

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

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

【问题讨论】:

  • 不要。让制作人修复它。这不是你的问题。您的问题是处理正确的请求。
  • 是的,我解释了同样的事情。不幸的是,需要记录所有内容...
  • 您不必解析事物来记录它们。只需记录原始数据。
  • 能否提供代码示例?因为它会很有帮助。
  • 我仍然同意@EJP 的第一点。问题出在客户端,而不是服务。如果客户端在服务中触发格式不正确的 XML,则其代码中存在错误,需要修复。

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


【解决方案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>

【讨论】:

  • 希望这是正确的。我不完全确定所有无效请求都会引发 SOAP 错误而不是其他一些异常。
  • 他们不会。语法错误可能会引发 HTTP 500 的任何问题。
  • 好吧,如果你发现任何无效的消息结构没有被日志拦截器拾取,你只需看看是什么引发了它们并寻找 Spring 记录它们的位置,并设置它们的日志记录级别调试。冲洗并重复。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2016-10-22
    相关资源
    最近更新 更多