如何在符合Java EE 7的容器中拦截JAX-RS中的选择性方法和类?

我想拦截用@Foo注释的任何类或方法

级别拦截:

@Foo
@path("/foo")
public class Attack {...}

方法级别拦截:

@path("/bar")
public class defend {

@Foo
@GET
public String myMethod(){....}

我想拦截用@Foo注释的任何类或方法,但不拦截其他方法或类.我想在继续执行方法之前打印出整个路径或URI.一个方法调用完成,我想打印出“执行成功”

这是这样的事情:

 system.out.println(path) // this is the path the request is made. something like /api/2/imp/foo
   method call happens
   method call finishes
   System.out.println("executed successfully")

我的情况不同,但这是我的根本问题.我不想具体实施. Java EE 7规范有一种方法可以使用@Postconstruct,@ AroundInvoke等来实现这一点.但是我真的很难组装它.

这个post绝对是解决这个问题的好方法.但它是特定于实现的(RESTeasy),并且不推荐使用它所使用的AcceptByMethod.

谢谢

解决方法:

拦截器非常简单:

@Foo @Interceptor
public class FooInterceptor
{
    @AroundInvoke
    public Object handleFoo(InvocationContext joinPoint) throws Exception
    {
        Method m = joinPoint.getMethod();

        // you can access all annotations on your @Foo-annotated method,
        // not just the @Foo annotation.
        Annotation[] as = m.getDeclaredAnnotations();

        // do stuff before the method call
        ...

        try
        {
            // here you call the actual method
            return joinPoint.proceed();
        }
        finally
        {
            // do stuff after the method call
            ...
        }
    }
}

这是注释的外观:

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface Foo
{
    @Nonbinding
    ... // you could add parameters for your annotation, e.g. @Foo(value)
}

这就是你如何使用它:

@Stateless
public class MyService
{
    @Foo("bar")
    public String myWrappedMethod()
    {
        ...
    }
}

myWrappedMethod中的代码将由FooInterceptor中的代码“包装”.
请注意,只有在对容器管理myWrappedMethod()的方法调用时,才会调用拦截器,即您在MyService的托管实例上调用它(例如,通过@Inject)

上一篇:spring – 为什么我的自定义ClientHttpRequestInterceptor具有空响应


下一篇:mybatis-插件的执行流程