我想拦截用@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)