![](/img/trans.png)
[英]Java EE CDI Interceptor not working when annotation has parameters
[英]CDI interceptor does not work when annotation has parameter
我正在尝试实现一个@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()
今天我重新审视了这个特定的问题,并注意到它与 CDI 无关:
ctx.getClass().getAnnotation(Restricted.class)
显然,我的示例中没有类级别的注释。 所以 getAnnotation() 返回null
。 相反,我应该使用以下内容:
ctx.getMethod().getAnnotation(Restricted.class)
虽然我不知道为什么那里没有任何例外。 也许其他一些事情正在发生,我无法再重现,因为我将我的应用程序迁移到了 TomEE。
如果您切换到 TomEE,您将不需要依赖(maven)实现,只需要 api(使用 org.apache.openejb:javaee-api:6.0-4 和提供的范围
听起来您的设置正确(beans.xml 和拦截器)。 您使用的是哪种 CDI 实现? 如果您使用 Tomcat,您是否考虑过使用 TomEE?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.