我在向Java EE 7应用程序添加参数化日志记录拦截器时遇到了一个奇怪的问题。
我从使用@Interceptors注解的类拦截器到编写自定义拦截器绑定。我没有的是这个样子的.
注解
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.TYPE,
ElementType.METHOD
})
public @interface LogMethodCall {
MethodLogger logLevel() default MethodLogger.INFO;
}
拦截器
@Slf4j
@LogMethodCall
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class ActionInterceptor {
@AroundInvoke
protected Object protocolInvocation(final InvocationContext ic) throws Exception {
log.info(
"{}: <{}> called. Parameters={}",
ic.getTarget().getClass().getName(),
ic.getMethod().getName(),
ic.getParameters());
return ic.proceed();
}
}
用法
@GET
@Path("/{account}")
@LogMethodCall
public void inboxes(@Suspended AsyncResponse response, @PathParam("account") String account) {
...
}
当我像这样使用它时,一切都正常。
在我尝试使用时购买更改logLevel并使用
@LogMethodCall(logLevel=MethodLogger.DEBUG)
那么我的拦截器就永远不会被调用。
这里我漏掉了什么?为什么设置注释值会破坏代码?
发布于 2016-04-13 04:48:38
如果您说您的拦截器仅当值为INFO时才捕获,则可以考虑将logLevel()
属性设置为@Nonbinding。
默认情况下,会考虑使用限定符参数将bean限定符与注入点限定符进行匹配。@非绑定参数不会被视为匹配。
试试这个:
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.TYPE,
ElementType.METHOD
})
public @interface LogMethodCall {
@Nonbinding MethodLogger logLevel() default MethodLogger.INFO;
}
https://stackoverflow.com/questions/36583102
复制相似问题