最近我尝试了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
1条答案
按热度按时间qv7cva1a1#
您应该将
jakarta.annotation
相依性的范围宣告为provided
:如果你有
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永远不会找到这些类的附加副本。