包装@Endpoint注释的Spring-WS端点的调用

时间:2011-07-14 16:25:05

标签: java web-services spring spring-ws

(Java 6,Spring 3,Spring-WS 2,JAXB2,Tomcat 6)

我需要将请求和响应XML记录到数据库表中。我希望能够在接收到请求XML时创建记录,并在响应XML(或错误)准备就绪时更新相同的记录。有没有办法用Spring-WS 2做到这一点?

我想在解组XML之前包装端点的调用,这样我就可以保存请求XML,调用端点,最后保存响应XML。保存请求XML后,我将使用从DB返回的唯一ID来识别需要使用响应XML更新的记录。

非常感谢所有帮助!

2 个答案:

答案 0 :(得分:0)

是的,您可以通过复制log4j.properties文件中的以下行来记录soap请求和响应。

log4j.rootCategory=INFO, stdout
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=DEBUG

log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p [%c{3}] %m%n

您可以从此链接http://static.springsource.org/spring-ws/sites/2.0/reference/html/common.html

获取更多信息

答案 1 :(得分:0)

您可以使用Spring-WS EndpointInterceptors

实施拦截器。

您必须实现org.springframework.ws.server.EndpointInterceptor接口,其中提供了处理请求和响应事件的方法。

通过访问MessageContext对象,您可以检索请求和响应消息(getRequest和getResponse方法)。 您还可以使用setProperty方法将信息存储在响应中可访问的请求时刻,以便关联信息(例如,要在DB中更新的记录的ID)。

配置拦截器。

拦截器可以针对特定请求进行配置,也可以针对所有Web服务进行全局配置。我从文档中复制了一些配置:

<sws:interceptors>
 <bean class="samples.MyGlobalInterceptor"/>
<sws:payloadRoot namespaceUri="http://www.example.com">
 <bean class="samples.MyPayloadRootInterceptor"/>
</sws:payloadRoot>
 <sws:soapAction value="http://www.example.com/SoapAction">
  <bean class="samples.MySoapActionInterceptor1"/>
  <ref bean="mySoapActionInterceptor2"/>
 </sws:soapAction>
</sws:interceptors>

<bean id="mySoapActionInterceptor2" class="samples.MySoapActionInterceptor2"/>