【问题标题】:Parameter interceptor not working in Java EE参数拦截器在 Java EE 中不起作用
【发布时间】:2014-08-06 11:18:05
【问题描述】:

在 Java EE 中,我试图在方法参数具有特定注释时调用拦截器。这是我的代码:

注解的代码

@Retention(RUNTIME)
@Target(PARAMETER)
public @interface Token{
   //NOP
}

拦截器的代码

@Interceptor
public class TokenInterceptor{

   @AroundInvoke
   public Object checkInvocation(InvocationContext ctx) throws Exception {
       //Actual Code that detects the presence of the annotation
   }

}

带注释参数的方法

public void processOrders(@Token List<Order> token) {}

beans.xml

<interceptors>
    <class>com.project.security.TokenInterceptor</class>
</interceptors>

当我尝试部署我的 JBoss 服务器时,出现以下错误。

原因:org.jboss.weld.exceptions.DeploymentException: WELD-000069 拦截器必须至少有一个绑定,但 com.project.security.TokenInterceptor 没有 在 org.jboss.weld.bean.InterceptorImpl.(InterceptorImpl.java:72) 在 org.jboss.weld.bean.InterceptorImpl.of(InterceptorImpl.java:59) 在 org.jboss.weld.bootstrap.AbstractBeanDeployer.createInterceptor(AbstractBeanDeployer.java:229) 在 org.jboss.weld.bootstrap.BeanDeployer.createBeans(BeanDeployer.java:149) 在 org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:204) 在 org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:349) 在 org.jboss.as.weld.WeldStartService.start(WeldStartService.java:63) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1] 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1] ... 3 更多

有什么想法可以让它发挥作用吗?

【问题讨论】:

    标签: jakarta-ee parameters jboss cdi interceptor


    【解决方案1】:

    您需要像这样为每个拦截器绑定

    @Inherited
    @InterceptorBinding
    @Retention(RUNTIME)
    @Target({METHOD, TYPE})
    public @interface Logged {
    }
    

    拦截器本身需要用你的绑定注解

    @Interceptor
    @Logged
    public void TokenInterceptor {
    
        @AroundInvoke
        public Object checkInvocation(InvocationContext ctx) throws Exception {
            //Actual Code that detects the presence of the annotation
        }
    }  
    

    现在您可以使用@Logged 注释将您的拦截器绑定到任何方法或类

    @Logged
    public void processOrders(List<Order> token) {}
    

    参见官方 Java EE 教程reference

    【讨论】:

    • 您包含的代码用于方法拦截器。就我而言,它是@Target(PARAMETER)。如果可能的话,我想避免创建@Target({METHOD, TYPE})
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2019-03-23
    • 2015-11-22
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多