我正在研究拦截器在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说但没有改变
答案 0 :(得分:0)
您忘记使用@Logged
注释LoggedInterceptor类。这实际上将注释绑定到拦截器。
@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {
}
他们在其中一个Java EE 6教程中也这样做。
看起来SuperService
只是一个普通的课程。拦截器是Java EE概念,仅适用于部署在应用程序服务器上的EJB。