gpt4 book ai didi

java - 当注解有参数时 CDI 拦截器不工作

转载 作者:搜寻专家 更新时间:2023-10-31 20:03:53 25 4
gpt4 key购买 nike

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

注释:

@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();
}
}

Controller :

@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)

虽然我不知道为什么没有任何异常(exception)。也许发生了其他一些事情,我无法再重现这些事情,因为我将我的应用程序迁移到了 TomEE。

关于java - 当注解有参数时 CDI 拦截器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15709203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com