Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 侦听器绑定不工作_Java_Jakarta Ee_Java Ee 6_Interceptor_Websphere 8 - Fatal编程技术网

Java 侦听器绑定不工作

Java 侦听器绑定不工作,java,jakarta-ee,java-ee-6,interceptor,websphere-8,Java,Jakarta Ee,Java Ee 6,Interceptor,Websphere 8,我创建了一个自定义注释,如下所示 @InterceptorBinding @Retention(RUNTIME) @Target(TYPE, METHOD) public @interface Traceable {} @Traceable @Interceptor public class EnterExitLogger { @AroundInvoke public Object aroundInvoke(InvocatiobContext c) {} } @Traceab

我创建了一个自定义注释,如下所示

@InterceptorBinding
@Retention(RUNTIME)
@Target(TYPE, METHOD)
public @interface Traceable {}
@Traceable
@Interceptor
public class EnterExitLogger {
    @AroundInvoke
    public Object aroundInvoke(InvocatiobContext c) {}
}
@Traceable
public class CDIManagedBean {
}
<interceptors>
    <class>my.package.EnterExitLogger</class>
</interceptors>
我写了一个截取器,如下所示

@InterceptorBinding
@Retention(RUNTIME)
@Target(TYPE, METHOD)
public @interface Traceable {}
@Traceable
@Interceptor
public class EnterExitLogger {
    @AroundInvoke
    public Object aroundInvoke(InvocatiobContext c) {}
}
@Traceable
public class CDIManagedBean {
}
<interceptors>
    <class>my.package.EnterExitLogger</class>
</interceptors>
拦截器和注释位于名为common utils的模块中

我在类级别用@Traceable注释了我的目标类,如下所示

@InterceptorBinding
@Retention(RUNTIME)
@Target(TYPE, METHOD)
public @interface Traceable {}
@Traceable
@Interceptor
public class EnterExitLogger {
    @AroundInvoke
    public Object aroundInvoke(InvocatiobContext c) {}
}
@Traceable
public class CDIManagedBean {
}
<interceptors>
    <class>my.package.EnterExitLogger</class>
</interceptors>
我在beans.xml文件中声明了拦截器条目,如下所示

@InterceptorBinding
@Retention(RUNTIME)
@Target(TYPE, METHOD)
public @interface Traceable {}
@Traceable
@Interceptor
public class EnterExitLogger {
    @AroundInvoke
    public Object aroundInvoke(InvocatiobContext c) {}
}
@Traceable
public class CDIManagedBean {
}
<interceptors>
    <class>my.package.EnterExitLogger</class>
</interceptors>

my.package.EntereExitLogger
目标类位于单独的模块中。xml位于目标类模块的META-INF目录中

从rest类调用目标类的方法。当我调用这些方法时,不会调用拦截器的AroundInvoke方法

我阅读了文档并理解拦截器应该包含一个公共的无参数构造函数。我加上去了。但仍然没有调用拦截器

阅读文档后,我在自定义注释中添加了@Inherited。但仍然没有调用拦截器

从文档中,我注意到拦截器实现了可序列化接口。虽然没有提到,但我也实现了Serializable。还是不行

然后,我从拦截器beans.xml文件和目标类中删除了自定义注释。我还从拦截器中删除了公共无参数构造函数,并删除了Serializable

然后我用
@Interceptors(EnterExitLogger.class)
注释了目标类,并调用了流。我的拦截器被叫来了

谁能告诉我如何使用拦截器绑定

附言

我正在WAS 8.5服务器中部署我的ear。

提供了一个很好的解释和一些关于拦截器的示例:

创建拦截器绑定批注,该批注必须使用和进行批注:

创建使用上面创建的拦截器绑定注释以及注释进行注释的incerceptor类

每个方法都接受一个参数,返回一个,并抛出一个。该方法必须调用该方法,这将导致调用目标类方法:

@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {

    public LoggedInterceptor() {

    }

    @AroundInvoke
    public Object logMethodEntry(InvocationContext invocationContext) throws Exception {

        System.out.println("Entering method: "
                + invocationContext.getMethod().getName() + " in class "
                + invocationContext.getMethod().getDeclaringClass().getName());

        return invocationContext.proceed();
    }
}
@Logged
@SessionScoped
public class PaymentHandler implements Serializable {...}
一旦定义了拦截器和绑定类型,就可以使用绑定类型对bean和各个方法进行注释,以指定在bean的所有方法或特定方法上调用拦截器

例如,
PaymentHandler
bean被注释为
@Logged
,这意味着对其业务方法的任何调用都将导致侦听器的方法被调用:

@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {

    public LoggedInterceptor() {

    }

    @AroundInvoke
    public Object logMethodEntry(InvocationContext invocationContext) throws Exception {

        System.out.println("Entering method: "
                + invocationContext.getMethod().getName() + " in class "
                + invocationContext.getMethod().getDeclaringClass().getName());

        return invocationContext.proceed();
    }
}
@Logged
@SessionScoped
public class PaymentHandler implements Serializable {...}
但是,通过仅注释所需的方法,您只能截取bean的一组方法:

@Logged
public String pay() {...}

@Logged
public void reset() {...}
为了在CDI应用程序中调用拦截器,必须在
beans.xml
文件中指定拦截器:

<interceptors>
    <class>your.package.LoggedInterceptor</class>
</interceptors>

您的.package.LoggedInterceptor

如果应用程序使用多个拦截器,将按照
beans.xml
文件中指定的顺序调用拦截器。

在保存拦截器的模块中添加一个空的beans.xml文件后,该问题已得到修复。我认为beans.xml文件只有在我想使用cdi注入时才是必需的

不幸的是,我不得不添加beans.xml并声明标记,甚至JavaEE7!谢谢