没想到要弄这么一个东西。

起初只是想用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 - 拦截器获取调用方法的更多相关文章

  1. Web Service学习之七:CXF拦截器

    一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...

  2. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)

    CXF拦截器使用,创建一个使用SOAPHeader的安全验证xml格式: <soap:Header> <auth:authentication xmlns:auth="ht ...

  3. CXF拦截器(Interceptor)LoggingInInterceptor

    Interceptor是CXF架构中一个重要的功能.你可以在不对核心模块进行修改的情况下,动态添加很多功能(你可以想象Struts2拦截器的优点).这对于CXF这个以处理消息为中心的服务框架来说是非常 ...

  4. SpringBoot 拦截器获取http请求参数

    SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 目录 SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 获取http请求参数是一种刚需 定义拦截器获取请求 为 ...

  5. Structs2 中拦截器获取请求参数

    前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...

  6. 如何在Struts2的拦截器中调用Spring容器

    第一种: 通常用ApplicationContext来调用Spring配置文件中的一些Bean,所以首先创建Spring上下文容器. ApplicationContext ac = (Applicat ...

  7. 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制

    权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...

  8. 被@ResponseBoby注释的方法在拦截器的posthandle方法中设置cookie失效的问题

    文章标题可能有点绕口.先来解释下遇到的问题. 我写了一个拦截器,希望能够实现保存特定方法的请求参数到cookie中. public class SaveParamInterceptor extends ...

  9. axios拦截器的使用方法

    很多时候我们需要在发送请求和响应数据的时候做一些页面处理,比如在请求服务器之前先判断以下用户是登录(通过token判断),或者设置请求头header,或者在请求到数据之前页面显示loading等等,还 ...

随机推荐

  1. ajax 多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题

     多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题 浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉.当我们执行异步ajax的时候没有问 ...

  2. Heimich manoeuvre 海姆利克氏操作

    食物,异物卡喉的问题屡见不鲜,造成呼吸困难,甚至心跳停止. 一旦发生这个状况,千万千万不要叩击病人的背部,应在迅速联系医院救援的同时,对病人进行现场急救. heimlich的实施最重要的功能是可以实现 ...

  3. 【Linux】CentOS7上解压zip需要安装uzip

    1.安装zip.unzip应用 yum install zip unzip 2.压缩和解压文件 以下命令均在/home目录下操作 cd /home #进入/home目录 a.把/home目录下面的my ...

  4. AOP之 Filter实用

    前言 开心一笑~~~ 一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面是一个老奶奶和一个年轻漂亮的姑娘.两个上前坐了下来.程序 ...

  5. 接口测试:添加header信息

    一.获取所有学生信息的接口文档内容 二.使用postman进行测试 选择请求方式.填写URL.填写Headers下的参数值(key是Referer.value是接口文档中的value值) 三.使用jm ...

  6. leecode刷题(12)-- 整数反转

    leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...

  7. [Maven实战-许晓斌]-[第三章] Mave使用入门二(在IDE中的使用) [第四章] 案例的背景介绍

    创建maven项目

  8. luoguP4568 [JLOI2011]飞行路线

    https://www.luogu.org/problemnew/show/P4568 题目中 k 的大小只有 10,我们可以考虑建立分层图跑最短路 相同层中 a -> b 的权值仍为 val, ...

  9. 网络CCNA基础了解

    关于网络 CCNA.CCNP.CCIE 中的 CCNA 一.逻辑与.或.非 AND --> "与"计算 1 AND 1 = 1(取严) 1 AND 0 = 0 0 AND 1 ...

  10. CentOS 下安装 Hexo 博客

    前言: 之前一直使用Wordpress架构作为博客网站架构,但是现在频频爆出漏洞.实在是不敢用也不想用了,然后群里面有小伙伴用的是 Github 搭建 Hexo 架构博客.就写了这个教程,给自己做个参 ...