Jakarta ee 为什么我的拦截器不工作?

Jakarta ee 为什么我的拦截器不工作?,jakarta-ee,cdi,interceptor,Jakarta Ee,Cdi,Interceptor,我有两个不同的项目:A和B B包含一个拦截器,我想在项目A中使用,将来在项目C和d中使用 我在两个项目中都使用jboss-javaee-6.0版本3.0.3.Final(这意味着CDI版本1.0) 项目B(不包含bean.xml): 项目A(包含beans.xml): xml(声明拦截器以激活它): 当我部署应用程序时,会出现错误 weblogic.management.DeploymentException: org.jboss.weld.exceptions.DeploymentExcept

我有两个不同的项目:A和B

B包含一个拦截器,我想在项目A中使用,将来在项目C和d中使用

我在两个项目中都使用jboss-javaee-6.0版本3.0.3.Final(这意味着CDI版本1.0)

项目B(不包含bean.xml):

项目A(包含beans.xml):

xml(声明拦截器以激活它):

当我部署应用程序时,会出现错误

weblogic.management.DeploymentException: org.jboss.weld.exceptions.DeploymentException: WELD-001417 Enabled interceptor class <class>commons.utils.logging.performanceInterceptor.LoggingInterceptor    </class> in file:/D:/projectos/myProject/target/myProject/WEB-INF/beans.xml@7 is neither annotated @Interceptor nor registered through a portable extension:org.jboss.weld.exceptions.DeploymentException:WELD-001417 Enabled interceptor class <class>commons.utils.logging.performanceInterceptor.LoggingInterceptor</class> in file:/D:/projectos/myProject/target/myProject/WEB-INF/beans.xml@7 is neither annotated @Interceptor nor registered through a portable extension
at org.jboss.weld.bootstrap.Validator.validateEnabledInterceptorClasses(Validator.java:503)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:373)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:379)
at com.oracle.injection.provider.weld.WeldInjectionContainer.start(WeldInjectionContainer.java:110)
at com.oracle.injection.integration.CDIAppDeploymentExtension.initCdi(CDIAppDeploymentExtension.java:76)
weblogic.management.DeploymentException:org.jboss.weld.exceptions.DeploymentException:weld-001417在文件:/D:/projectos/myProject/target/myProject/WEB-INF/beans中启用了侦听器类commons.utils.logging.performanceInterceptor.LoggingInterceptor。xml@7既没有注释@Interceptor,也没有通过可移植的扩展名:org.jboss.weld.exceptions.DeploymentException:weld-001417启用的拦截器类commons.utils.logging.performanceInterceptor.LoggingInterceptor,位于文件:/D:/projectos/myProject/target/myProject/WEB-INF/beans中。xml@7既没有注释@Interceptor,也没有通过可移植扩展注册
位于org.jboss.weld.bootstrap.Validator.validateEnabledInterceptorClasses(Validator.java:503)
位于org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:373)
位于org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:379)
位于com.oracle.injection.provider.weld.WeldInjectionContainer.start(WeldInjectionContainer.java:110)
位于com.oracle.injection.integration.CDIAppDeploymentExtension.initCdi(CDIAppDeploymentExtension.java:76)
我的第一个想法是,因为拦截器位于project a lib中的一个jar中,所以它是不可见的。我升级到JavaEE7版本1.0.3.Final和CDI1.1,以便在LoggingInterceptor中使用标记@Priority。错误消失了,但它不起作用(没有写入日志)。所以我回到了JavaEE6版本3.0.3.Final和CDI1.0

我猜我可能找不到拦截器,因为beans.xml中的路径不是jar中的正确路径(它在\WEB-INF\lib\loggings-1.2.jar\commons\utils\logging\performanceInterceptor中)


有人知道什么地方可能出错吗?

问题下方的评论为您指明了一个好的方向

项目B应该是一个所谓的
bean存档
——在JavaEE6中,它是通过在这样的存档中包含
beans.xml
来实现的(即使是完全空的内容也足够了)

你说:


项目B不是一个web应用程序,这就是为什么它没有beans.xml。它是一个横向项目,为许多项目提供了共同的特征

你有点错了-
beans.xml
在你的情况下,仍然必须存在。在JAR归档中,它应该放在
src/main/resources/META-INF/
文件夹中(如果您使用的是maven)

对于WAR包装,它应该放在
src/main/webapp/WEB-INF/


还有一件事:你在评论中说了两种相反的说法:

项目B不是一个web应用程序

而且:


如果我将beans.xml添加到项目B(…)(/webapp/WEB-INF/beans.xml,因为它是一个war

那么真相是什么呢?

1)在beans.xml中添加标记
bean发现模式,如上面的示例所示:

<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>YOUR_CLASS__FROM_THE_JAR</class>
    </interceptors>
</beans>

你的类来自罐子
2) 在包含拦截器的jar中,在
src/main/resources
中添加一个名为
META-INF
的文件夹,并在一个
beans.xml
文件中添加
标记

这对我很管用


另外,尝试使用方法
main
在类中创建一个独立的容器(我建议使用WELD),并测试您的拦截器。

我遇到了一个类似的问题,我的拦截器不是为某些带注释的方法调用的,而是为其他一些方法调用的。 问题是使用拦截器注释的类(RESTClient.java)没有被注入,而是通过构造函数初始化的。 为了解决这个问题,我做了如下工作:

@Inject
private Provider<RESTClient> restClientProvider;
//..
RESTClient restClient = restClientProvider.get();
restClient.init(
//do whatever the constructor was doing here.
);
@Inject
私有提供者restClientProvider;
//..
RESTClient RESTClient=restClientProvider.get();
restClient.init(
//不管构造器在这里做什么。
);

beans.xml
添加到项目B。如果项目打包为WAR文件,请确保它位于
WEB-INF
中。如果是JAR文件,请确保它位于
META-INF
中。Project B不是web应用程序,因此它没有beans.xml。这是一个横向项目,为不常用的项目提供公共功能。Cassio是对的,beans.xml将为CDI引擎标记project-B如果我使用拦截器向项目B添加一个beans.xml(/webapp/WEB-INF/beans.xml,因为它是war),并且我在项目a中删除拦截器,部署错误消失了,但它仍然没有调用logMethodEntry方法。如果我将拦截器保留在两个beans.xml中,那么错误是相同的。在添加beans.xml时我是否缺少任何额外的配置?我误解了a和B。项目B不是一个web应用程序,而是一个jar。我可能应该改为在META-INF中添加一个beans.xml,并尝试一下。我已经在项目B中添加了beans.xml,声明LoggingInterceptor(inside/META-INF/)。但是,即使我可以在jar文件中看到beans.xml,也没有调用拦截器。
weblogic.management.DeploymentException: org.jboss.weld.exceptions.DeploymentException: WELD-001417 Enabled interceptor class <class>commons.utils.logging.performanceInterceptor.LoggingInterceptor    </class> in file:/D:/projectos/myProject/target/myProject/WEB-INF/beans.xml@7 is neither annotated @Interceptor nor registered through a portable extension:org.jboss.weld.exceptions.DeploymentException:WELD-001417 Enabled interceptor class <class>commons.utils.logging.performanceInterceptor.LoggingInterceptor</class> in file:/D:/projectos/myProject/target/myProject/WEB-INF/beans.xml@7 is neither annotated @Interceptor nor registered through a portable extension
at org.jboss.weld.bootstrap.Validator.validateEnabledInterceptorClasses(Validator.java:503)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:373)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:379)
at com.oracle.injection.provider.weld.WeldInjectionContainer.start(WeldInjectionContainer.java:110)
at com.oracle.injection.integration.CDIAppDeploymentExtension.initCdi(CDIAppDeploymentExtension.java:76)
<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>YOUR_CLASS__FROM_THE_JAR</class>
    </interceptors>
</beans>
@Inject
private Provider<RESTClient> restClientProvider;
//..
RESTClient restClient = restClientProvider.get();
restClient.init(
//do whatever the constructor was doing here.
);