拦截器的@AroundInvoke未触发

时间:2017-09-13 11:36:09

标签: java aop interceptor

我正在研究拦截器在java中的工作原理。我正在使用Netbeans IDE,刚刚创建了一个名为Interceptors的新项目。

我创建了一个名为“已记录”的注释

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

然后我创建了一个类“LoggedInterceptor”

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

的类
public class SuperService 
{
    @Logged
    public String deliverService(String uid) 
    {
        return uid;
    }

    public static void main(String[] args) 
    {
        SuperService ss = new SuperService();
        System.out.println(ss.deliverService("sisi"));
    }
}

什么都没发生。后来我在src / main / resources / META-INF /一个名为beans.xml的xml文件中添加了

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                           http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    version="1.1"
    bean-discovery-mode="all">
    <interceptors>
        <class>ascompany.interceptors.LoggedInterceptor</class>
    </interceptors>
</beans>

但是当我调用deliverService方法时,不会调用logMethodEntry方法。我错过了其他一些配置文件吗?或者只是别的什么?

我已经尝试将@Priority注释添加到LoggedInterceptor但没有改变......

编辑:

我将logget注释添加到LoggedInterceptor,因为@Luciano van der Veekens说但没有改变

1 个答案:

答案 0 :(得分:0)

您忘记使用@Logged注释LoggedInterceptor类。这实际上将注释绑定到拦截器。

@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {
}

他们在其中一个Java EE 6教程中也这样做。

看起来SuperService只是一个普通的课程。拦截器是Java EE概念,仅适用于部署在应用程序服务器上的EJB。