当注释具有参数时,CDI拦截器不起作用

问题描述 投票:5回答:3

我正在尝试实现@Restricted批注,以保护控制器方法,使其仅在用户登录并具有特定角色时才可以访问它们。我在使用JSF和CDI的Tomcat 7上,所以没有EJB。只要注释接口未指定任何参数,拦截器就会被调用。一旦添加@Nonbinding Role value() default Role.ADMIN;参数,拦截器和控制器方法都不会执行。也没有错误或异常。这是我的代码,我真的不知道这是怎么回事:

注释:

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Restricted {
    @Nonbinding Role value() default Role.ADMIN; // ###
}

拦截器:

@Interceptor
@Restricted
public class RoleBasedRestrictingInterceptor implements Serializable {
    @Inject
    ISecurityManager security;

    @AroundInvoke
    public Object intercept(final InvocationContext ctx) throws Exception {
        final Restricted annotation = ctx.getClass().getAnnotation(Restricted.class);
        log.info("Intercepted, required role is: {}", annotation.value()); // ###
        log.info("User is logged in: {}", security.isLoggedIn());
        return ctx.proceed();
    }
}

控制器:

@Named("manageUsers")
@SessionScoped
public class ManageUsersBacking extends implements Serializable {   
    @Restricted(Role.ADMIN) // ###
    public void testRestricted() {
        log.info("testRestricted()");
    }
}

###事件标记必须更改或删除才能使其再次起作用。拦截器在WEB-INF/beans.xml中已正确定义,因为它在我的注释中没有角色参数的情况下也可以工作。

16:04:33.772 [http-apr-8080-exec-11] INFO  c.m.s.RoleBasedRestrictingInterceptor - User is logged in: true
16:04:33.772 [http-apr-8080-exec-11] INFO  c.m.c.admin.ManageUsersBacking - testRestricted()
java tomcat annotations cdi interceptor
3个回答
4
投票

今天,我重新审视了这个特殊问题,并注意到它与CDI无关:

ctx.getClass().getAnnotation(Restricted.class)

显然,在我的示例中没有类级别的注释。因此getAnnotation()返回null。相反,我应该使用以下内容:

ctx.getMethod().getAnnotation(Restricted.class)

尽管我不知道为什么那里没有例外。也许正在发生其他事情,因为我将应用程序迁移到TomEE,所以我无法再复制。


1
投票

如果切换到TomEE,则无需依赖(实现)实现,只需使用api(使用提供范围的org.apache.openejb:javaee-api:6.0-4


0
投票

听起来您的设置正确(beans.xml和拦截器)。您正在使用哪种CDI实现?如果您使用的是Tomcat,您是否考虑过使用TomEE?

© www.soinside.com 2019 - 2024. All rights reserved.