需要实现一个功能,即记录每次webservice服务调用的一些参数,比如调用时间,执行时间等。原来的产品是使用axis开发的,接到这个功能的时候便想着采用Spring AOP结合CXF的方式来实现,于是开始准备一个Demo。

@WebService
@SOAPBinding(style = Style.DOCUMENT)
public interface HelloWorld {public String sayHello(@WebParam(name = "name") String name);
}public class HelloWorldImpl implements HelloWorld {@Overridepublic String sayHello(String name) {return name + " Say:hello world~!!!!!!!!!!!!!";}}

定义接口,定义实现类,然后配置Spring容器

<bean id="helloWorldImpl"class="com.smart.service.testcxf.HelloWorldImpl" /><jaxws:endpoint id="helloWorldService"implementor="#helloWorldImpl" address="/helloWorld"><jaxws:properties><entry key="mtom-enabled" value="true" /></jaxws:properties></jaxws:endpoint>

启动服务,客户端采用C#,根据WSDL生成对应的服务代理类,调用服务,直接报错,application/xop+xml等等。

好吧,辛辛苦苦查资料,终于解决,消息编码问题,只需修改配置的编码方式为“Mtom”就能解决问题。
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding messageEncoding="Mtom">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>

百度资料之后,貌似客户端是.NET的就会有这个问题,JAVA的不存在这个问题。
解决之后满心欢喜,基于@AspectJ定义切面,增强类型为环绕增强,代码准备完毕之后,满心欢喜,先利用Junit测试一下,结果如下

哈哈,没问题,那就直接跑服务来测试,服务端日志打印也是正常的,但是客户端就很尴尬了

没有数据返回!!!想想可能的原因是服务类被代理了,新生成的代理类没有@WebService的注解,所以导致服务数据返回失败。
最终百度了下,说重写AbstractJaxWsServiceExporter和SimpleHttpServerJaxWsServiceExporter这两个类,在加载的时候自己处理获取原型类和对象,该层的切面交给Authenticator处理。这样能实现功能。
但是本人能力有限,折腾了一阵还是没能成功,希望哪位大佬给予指点,助小弟实现该功能,感激不尽噢。
没办法,最终转而使用CXF拦截器

  <!-- 单个拦截器 --><bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" /><bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/><bean id="myInInterceptor" class="com.smart.interceptor.MyInInterceptor"/>
  <!-- 输入日志拦截器 -->  <jaxws:inInterceptors>  <ref bean="inMessageInterceptor"/>  <ref bean="myInInterceptor"/>  </jaxws:inInterceptors>  <!-- 输出日志拦截器 -->  <jaxws:outInterceptors>  <ref bean="outMessageInterceptor"/>  </jaxws:outInterceptors>

此处myInInterceptor为自定义的In拦截器,

其中Phase.PRE_INVOKE在构造函数中声明,表示拦截器在哪个阶段起作用。重写handleMessage方法,这里做我们需要做的处理。
另外,因为调取webservice服务是异步的,所以实际拦截过程中,我们并不知道哪次OUT拦截对应IN拦截,这里我们需要做点处理。
在服务端IN拦截器中,添加如下代码

message.getExchange().put("CXF", "test");

在服务端OUT拦截器中,添加如下代码:

message.getExchange().get("CXF");

这里“CXF”作为key值,“test”作为value值,经过测试,同一次服务的IN message.getExchange()与OUT message.getExchange()相同的key得到的value值相同。

记一次Spring AOP拦截处理CXF WebService的失败经历相关推荐

  1. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  2. Spring AOP拦截规则的两种定义方式

    Spring AOP拦截规则的两种定义方式 AOP的根本目的就是解耦,分开业务代码与系统共用代码,例如打印日志. Spring支持AspectJ的注解式切面编程,主要包含4个部分,分别是 使用@Asp ...

  3. Spring学习总结(15)——Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  4. spring aop拦截自定义注解的切入点表达式

    @within(com.cxh.study.aop.controller.UserAccessAnnotation) 表示拦截含有com.cxh.study.aop.controller.UserAc ...

  5. spring aop 拦截业务方法,实现权限控制

    难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了 ...

  6. 框架:Spring Aop、拦截器、过滤器的区别

    Spring Aop.拦截器.过滤器的区别 Filter过滤器:拦截web访问的url地址. Interceptor拦截器:拦截以.action结尾的url,拦截Action的访问. Spring A ...

  7. spring---aop(3)---Spring AOP的拦截器链

    写在前面 时间断断续续,这次写一点关于spring aop拦截器链的记载.至于如何获取spring的拦截器,前一篇博客已经写的很清楚(spring---aop(2)---Spring AOP的JDK动 ...

  8. Spring AOP是什么?你都拿它做什么?

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 转自:我叫刘半仙, https://my.oschina.net/liughDevelop/blo ...

  9. 使用spring aop实现业务层mysql 读写分离

    2019独角兽企业重金招聘Python工程师标准>>> 1.使用spring aop 拦截机制现数据源的动态选取. import java.lang.annotation.Eleme ...

最新文章

  1. SQL(基于MySQL)——LIMIT用法
  2. 查询mysql所有对象_Mysql查看数据库对象(SQL命令总结)
  3. android sdl,Android下SDL2实现五子棋游戏
  4. JS脚本显示当前日期+星期几[转]
  5. JQuery的ajax函数执行失败,alert函数弹框一闪而过
  6. python编写程序时必须遵守的规则被称为_Python程序设计方案习题与答案
  7. 你的手机支持5Gwifi吗?5G上网真的很快吗?
  8. brackets ubuntu
  9. 为何电脑html无法删除,电脑文件无法删除该怎么办?几种解决方法介绍
  10. 【硬件解码系列】之DXVA2
  11. canvas换图时候会闪烁_基于Canvas实现的高斯模糊(上)「JS篇」
  12. 6. Zend Studio
  13. Quartus II文件编译下载和USB-Blaster驱动安装
  14. 响应式开发(六)-----Bootstrap CSS----------Bootstrap文本排版
  15. 苹果电脑怎么更换计算机模式,图文详解苹果电脑如何切换成windows系统
  16. 安卓终端模拟器运行PHP,ROOT用户福利:安卓终端模拟器简述及命令行入门!
  17. 智慧运维解决方案-最新全套文件
  18. Quectel移远展锐平台5G模组RX500U/RG200U使用指南(四)-工作模式】
  19. 帝国时代3java_帝国时代3-亚洲王朝
  20. iOS开发:UIImage 图片处理:截图,缩放,设定大小,存储

热门文章

  1. SOJ.Output the Yanghui triangel
  2. 【樂理】借用和弦(Borrowed chord)
  3. CTU Open Contest 2019
  4. 【计算机图形学】“Grabcut“Interactive Foreground Extraction using Iterated Graphcuts
  5. python实现CRITIC方法
  6. 【Oracle】常用对象之触发器
  7. CS231n+assignment2(一)
  8. CS231N 之 作业环境搭建
  9. MySQL启动报错1067(附排查解决方法)
  10. 【SDX62】WCN685X WiFi WPA3R3认证SAE-4.6.1测试失败问题解决方案