CXF - 拦截器获取调用方法
没想到要弄这么一个东西。
起初只是想用interceptor记录一下webservice调用日志,后来却被要求在页面展示。
展示容易,但只是展示webservice的地址无法让用户从中明白什么。
那么我可以把url和具体说明作为一对键值,但是这对键值配置到哪里比较好?
文件? db? 我不想每增加一个方法就到别的地方再配置一次键值,写到注解也许是个不错的方法。
这就需要我在方法被调用后在获得对应的Method对象。
当然,实现这个效果的方法有很多种,这里主要讲如何在CXF Interceptor中获取。
顺便一提,我是在web应用里配置Spring+CXF,拦截器只是简单继承了JAXRSIn/OutInterceptor。
比如,我有一个这样的方法:
@GET
@Path("/hello")
@Consumes({"*/*"})
public String Hello(){
return "Hello Alvez!";
}
我需要在调用结束后记录这个方法的名字 ,但不能是"Hello",而是"哈罗"。
那就定义一个注解并给方法加上:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
public String value();
}
@GET
@Path("/hello")
@Consumes({"*/*"})
@Description("哈罗")
public String Hello(){
return "Hello Alvez!";
}
好了,接下来就是从拦截器获得调用信息了。
InInterceptor还是OutInterceptor?
无论是哪一个,当我们重写了handleMessage时就自然地想到从Message对象中获取。
当然,如果你发现正在使用的方法参数列表中没有Message类型,也许你可以这样做。
Message message = JAXRSUtils.getCurrentMessage();
因为这个例子中使用到的JAXIn/OutInterceptor继承的是AbstractPhaseInterceptor<Message>,我们就可以理所当然地得到message对象。
public class JAXRSInInterceptor extends AbstractPhaseInterceptor {
//..
}
但一个Message里面却有不少内容,Exchange、Destination、Attachment、InterceptorChain,继续递归下去,如果不明白他们分别代表什么就无从找起。
也许我想用一个org.apache.cxf.service.invoker.MethodDispatcher(2.6.x中是org.apache.cxf.frontend.MethodDispatcher )
而理由仅仅是因为他有一个通过BindingOperationInfo对象获取java.lang.reflect.Method对象的方法:
public class JAXRSInInterceptor extends AbstractPhaseInterceptor {
//..
}
这样我就可以在拦截器中这样使用:
Exchange exchange = message.getExchange();
BindingOperationInfo bindingOperationInfo = exchange.getBindingOperationInfo();
SimpleMethodDispatcher methodDispatcher = new SimpleMethodDispatcher();
Method method = methodDispatcher.getMethod(bindingOperationInfo);
但很遗憾,exchange里哪来的bindingOperationInfo?
那exchange里有什么? 既然他是Map的子类,我可以看看他的keyset,发现outInterceptor中的message.getExchange().keySet()如下:
org.apache.cxf.rest.message
org.apache.cxf.resource.operation.name
org.apache.cxf.interceptor.LoggingMessage.ID
org.apache.cxf.endpoint.ConduitSelector
org.apache.cxf.jaxrs.model.OperationResourceInfo
org.apache.cxf.service.object.last
org.apache.cxf.endpoint.Endpoint
org.apache.cxf.service.Service
root.resource.class
service.root.provider
service.root.instance
org.apache.cxf.Bus
org.apache.cxf.binding.Binding
Accept
Content-Type
看到可以获取OperationResourceInfo,Request/ResponseHandler接口的默认方法中也包括这个参数,只是这两个接口已经在新版本中不能用了。(http://cxf.apache.org/docs/30-migration-guide.html)
但也提供了替代的方法(http://cxf.apache.org/docs/jax-rs.html)
e.g.我们可以从message中获得一切想要的信息,比如被调用过的方法;
OperationResourceInfo resourceInfo = (OperationResourceInfo) ex.get("org.apache.cxf.jaxrs.model.OperationResourceInfo");
ClassResourceInfo classResourceInfo = resourceInfo.getClassResourceInfo();
Path path = classResourceInfo.getPath();
Class<?> resourceClass = classResourceInfo.getResourceClass();
Method annotatedMethod = resourceInfo.getAnnotatedMethod();
Annotation[] declaredAnnotations = annotatedMethod.getDeclaredAnnotations();
Description annotation = annotatedMethod.getAnnotation(Description.class);
上面的Description就是文章开始时定义的注解,这样小问题就解决了。
CXF - 拦截器获取调用方法的更多相关文章
- Web Service学习之七:CXF拦截器
一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...
- CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
CXF拦截器使用,创建一个使用SOAPHeader的安全验证xml格式: <soap:Header> <auth:authentication xmlns:auth="ht ...
- CXF拦截器(Interceptor)LoggingInInterceptor
Interceptor是CXF架构中一个重要的功能.你可以在不对核心模块进行修改的情况下,动态添加很多功能(你可以想象Struts2拦截器的优点).这对于CXF这个以处理消息为中心的服务框架来说是非常 ...
- SpringBoot 拦截器获取http请求参数
SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 目录 SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 获取http请求参数是一种刚需 定义拦截器获取请求 为 ...
- Structs2 中拦截器获取请求参数
前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...
- 如何在Struts2的拦截器中调用Spring容器
第一种: 通常用ApplicationContext来调用Spring配置文件中的一些Bean,所以首先创建Spring上下文容器. ApplicationContext ac = (Applicat ...
- 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制
权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...
- 被@ResponseBoby注释的方法在拦截器的posthandle方法中设置cookie失效的问题
文章标题可能有点绕口.先来解释下遇到的问题. 我写了一个拦截器,希望能够实现保存特定方法的请求参数到cookie中. public class SaveParamInterceptor extends ...
- axios拦截器的使用方法
很多时候我们需要在发送请求和响应数据的时候做一些页面处理,比如在请求服务器之前先判断以下用户是登录(通过token判断),或者设置请求头header,或者在请求到数据之前页面显示loading等等,还 ...
随机推荐
- Windows10使用
1.常见问题 Win10 的操作中心如果不见了 Windows10电脑系统时间校准 实现windows与ubuntu的之间的复制与粘贴 安卓手机传递文件到Windows系统电脑 安卓手机高速传递文件到 ...
- vm虚拟机Kali无法拖拽文件解决办法
vm虚拟机Kali无法拖拽文件解决办法 apt-get updateapt-get install open-vm-tools-desktop fusereboot
- Java反射机制与工厂模式
工厂模式属于创建型模式,它提供了一种创建对象的最佳方式. 它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象. 简单工厂模式如下: inter ...
- 【loj#6503.】「雅礼集训 2018 Day4」Magic(生成函数+容斥)
题面 传送门 题解 复杂度比较迷啊-- 以下以\(n\)表示颜色总数,\(m\)表示总的卡牌数 严格\(k\)对比较难算,我们考虑容斥 首先有\(i\)对就代表整个序列被分成了\(m-i\)块互不相同 ...
- ObjectARX二次开发创建自己的静态库,如同objectARX库一样
objectARX二次开发的时候,经常会用到一些重复使用的类,如果类已经足够的好,那么我们可以编译成静态库,加快开发和编译的速度,提高工作效率. 环境vs2010+objectARX2012wizar ...
- [Flex] 修改注释中的@author方法
当然,在Flash Builder里,按Ctrl+Shift+D可以很方便在添加AsDoc注释,也可以修改,可是有些生成的@author是系统的用户名(如:administor),如何修改 修改方法之 ...
- nginx负载均衡配合keepalived服务案例实战
本实验用4台 centos6 虚拟机,2台做负载均衡,2台做web服务器,都先装上nginx lb01:192.168.0.235 --主负载均衡器 lb02:192.168.0.236 --备负 ...
- 各种 Python 库/模块/工具
1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高 ...
- Binaries和Source、tgz和zip的区别
在下载页面会有2种下载分类,一个是Binaries,一个是source,一般开放原代码软件都会有两个版本发布: Source Distribution 和 Binary Distribution ,二 ...
- 【python】10分钟教你用python如何正确把妹
前言 今天没妹子约,刚好研究一下.如何用神奇的python打造一个把妹神器吧.看完这个,你们就能走向人生巅峰,迎娶白富美啦. 我知道你们想看看效果 image 当然啦,这只是测试版的效果,真正的版本可 ...