gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:48:39 29 4
gpt4 key购买 nike

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

B 包含一个拦截器,我想在项目 A 以及将来的项目 C 和 D 中使用它。

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

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

@InterceptorBinding
@Target({TYPE, METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PerformanceLog {
}

@Interceptor
@PerformanceLog
public class LoggingInterceptor {
private static final Logger LOG = LoggerFactory.getLogger(LoggingInterceptor.class);

@AroundInvoke
public Object logMethodEntry(InvocationContext ctx) throws Exception {
LOG.debug("Entered method (" + ctx.getMethod().getName() + ") of class (" + ctx.getMethod().getClass() + ").");
}
}

项目 A(包含 beans.xml):

beans.xml(声明拦截器以激活它):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

<interceptors>
<class>commons.utils.logging.performanceInterceptor.LoggingInterceptor</class>
</interceptors>
</beans>

我的 Controller C:
@Named
@RequestScoped
public class MyControllerC implements Serializable {
...

@PerformanceLog
public void init() {
//do some BD access here
}
}

当我部署应用程序时出现错误
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)

我的第一个想法是,因为拦截器位于项目 A 库中的 jar 中,所以它不可见。我升级到 java-ee 7 版本 1.0.3.Final 和 CDI 1.1,以便我可以在 LoggingInterceptor 中使用标签 @Priority。错误消失了,但它不起作用(没有写入日志)。所以我回到了 java-ee 6 版本 3.0.3.Final 和 CDI 1.0。

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

有没有人知道可能有什么问题?

最佳答案

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

B项目应该是所谓的bean archive - 在 Java EE 6 中,它是通过包含 beans.xml 来实现的在这样的文件中(即使是完全空的内容就足够了)。

你说:

Project B is not a web app that's why it doesn't have a beans.xml. It is a transversal project that provides common features to numerous projects



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

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

还有一件事:你在评论中说了两个相反的陈述:

Project B is not a web app



并且:

If I add a beans.xml to Project B (...) (/webapp/WEB-INF/beans.xml because it is a war)



那么真相是什么呢?

关于jakarta-ee - 为什么我的拦截器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33653554/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com