首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java EE:尝试通过具有多个值的注释绑定拦截器

Java EE:尝试通过具有多个值的注释绑定拦截器
EN

Stack Overflow用户
提问于 2016-04-13 04:08:42
回答 1查看 814关注 0票数 1

我在向Java EE 7应用程序添加参数化日志记录拦截器时遇到了一个奇怪的问题。

我从使用@Interceptors注解的类拦截器到编写自定义拦截器绑定。我没有的是这个样子的.

注解

代码语言:javascript
运行
复制
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({
        ElementType.TYPE,
        ElementType.METHOD
})
public @interface LogMethodCall {

    MethodLogger logLevel() default MethodLogger.INFO;

}

拦截器

代码语言:javascript
运行
复制
@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();
    }

}

用法

代码语言:javascript
运行
复制
    @GET
    @Path("/{account}")
    @LogMethodCall
    public void inboxes(@Suspended AsyncResponse response, @PathParam("account") String account) {
        ...
    }

当我像这样使用它时,一切都正常。

在我尝试使用时购买更改logLevel并使用

代码语言:javascript
运行
复制
@LogMethodCall(logLevel=MethodLogger.DEBUG)

那么我的拦截器就永远不会被调用。

这里我漏掉了什么?为什么设置注释值会破坏代码?

EN

回答 1

Stack Overflow用户

发布于 2016-04-13 04:48:38

如果您说您的拦截器仅当值为INFO时才捕获,则可以考虑将logLevel()属性设置为@Nonbinding。

默认情况下,会考虑使用限定符参数将bean限定符与注入点限定符进行匹配。@非绑定参数不会被视为匹配。

试试这个:

代码语言:javascript
运行
复制
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({
        ElementType.TYPE,
        ElementType.METHOD
})
public @interface LogMethodCall {

    @Nonbinding MethodLogger logLevel() default MethodLogger.INFO;

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36583102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档