CDI - 使用来自库的拦截器类

时间:2012-06-12 11:48:37

标签: java logging glassfish cdi interceptor

我们可以在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中,但它对我不起作用。

感谢您的任何建议!

2 个答案:

答案 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而无需激活。