tomcat @资源注解在Tomact 10.0.10中不起作用

fquxozlt  于 2022-12-13  发布在  Mac
关注(0)|答案(1)|浏览(249)

最近我尝试了Tomcat 10.0.10,当尝试将连接池作为JNDI资源注入时,发现@Resource注解不起作用。
然后我试着通过创建一个InitialContext以编程的方式获得它,它成功了。最初我以为它只适用于java:comp/env/jdbc,所以我尝试使用一个简单的bean,如下面所示,并尝试用@Resource注解注入它,它再次失败。当我试着通过创建一个InitialContext以编程的方式获得它时,它成功了。然后我检查@PostConstruct@PreDestroy注解是否有效,发现它们也不起作用。
第一个
为了重现同样的问题,我在这里创建了一个示例存储库:https://github.com/sura-boy-playground/play-with-tomcat10(可在此处找到完整代码)
一开始,我使用了javax.annotation.Resource注解,所以我认为这是因为javax.*jakarta.*命名空间的变化。然后我尝试使用jakarta.annotation.Resource,但结果是一样的。

我使用Tomcat 9.0.41和javax.*命名空间尝试了相同的应用程序,它运行得非常好。
**是否需要在Tomcat 10.0.10上执行任何额外的操作才能启用这些注解?**我查阅了Tomcat 10文档,但找不到与我的问题相关的任何内容。

我发现以前在Tomcat 7中也有类似的情况,但我现在不喜欢这种解决方法。Tomcat @Resource annotations API annotation stops working in Tomcat 7

qv7cva1a

qv7cva1a1#

您应该将jakarta.annotation相依性的范围宣告为provided

<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>2.0.0</version>
    <scope>provided</scope>
</dependency>

如果你有jakarta.annotation.Resource的两个副本(一个在 common 类加载器中,一个在你的应用程序的类加载器中),这两个类是不同的。InstanceManager将查找用 common 类加载器的@Resource副本注解的字段,而something字段用你的webapp的@Resource副本注解。

编辑:此问题已在Tomcat 10.0.17(参见更改日志)、9.0.59和10.1.0-M11中修复。
备注:如果您使用Java 11或更高版本,在Tomcat 9.0中也会遇到同样的问题。在Java 11之前,javax.annotation.*类包含在JRE中。Servlet容器需要在 bootstrap/JRE classloader中查找,然后才能在webapp classloader中查找(覆盖javax.*类违反了Java的许可证),因此Tomcat永远不会找到这些类的附加副本。

相关问题