我们可以在ejb-jar中使用来自不同ejb-jar的基于注释的拦截器吗? 我用@Logged示例尝试了它,但坚持使用它。有人可以帮助我吗?
在core.jar中:
@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Logged {}
和
@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {
private static final long serialVersionUID = 1L;
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();
}
}
问题是:如何从另一个ejb-jar(企业应用程序内部)中使用此拦截器?例如:记录业务方法调用,其中方法可以在不同的模块中找到:
module1.jar:
public class ModuleClass{
@Logged public void doSomething(){...}
}
我试过将< interceptor>< class .....也放到beans.xml中,但它对我不起作用。
感谢您的任何建议!
答案 0 :(得分:2)
这应该绝对有效,尽管我记得我在JBoss 6上摆弄了很多东西。
你必须在它定义的JAR的beans.xml
中激活拦截器,并且我认为 EAR部署存在问题,但那是很久以前我无法再访问源代码。
如果这不起作用 - 在两个JAR中使用beans.xml
中的激活。如果拦截器已注册,请尝试查询BeanManager。
答案 1 :(得分:1)
我在JBoss 7上遇到了与logging interceptor完全相同的问题,并通过将完整的拦截器jar覆盖到应用程序中来修复它。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<overlays>
<overlay>
<groupId>com.github.t1</groupId>
<artifactId>logging-interceptor</artifactId>
<type>jar</type>
<targetPath>WEB-INF/classes</targetPath>
</overlay>
</overlays>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.github.t1</groupId>
<artifactId>logging-interceptor</artifactId>
<version>1.1</version>
<optional>true</optional>
</dependency>
</dependencies>
您仍然需要在应用程序breans.xml
中激活拦截器。
不好,但确实有效。在Java EE 7中,它通过将拦截器注释为@Priority
而无需激活。