- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我尝试了 Tomcat 10.0.10,当尝试将连接池作为 JNDI 资源注入(inject)时,发现 @Resource
注释不起作用。
然后我尝试通过创建 InitialContext
以编程方式获取它它奏效了。最初我认为它只适用于 java:comp/env/jdbc 所以我尝试了一个像下面这样的简单 bean 并尝试用 @Resource
注入(inject)它注释它再次不起作用。当我尝试通过创建 InitialContext
以编程方式获取它时它有效。然后我检查是否@PostConstruct
或 @PreDestroy
注释有效,发现它们也不起作用。
package lk.ijse.test.tomcatdbcp;
public class Something {
}
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="bean/Something" auth="Container"
type="lk.ijse.test.tomcatdbcp.Something"
factory="org.apache.naming.factory.BeanFactory"
/>
</Context>
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="false" xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<resource-env-ref>
<resource-env-ref-name>bean/Something</resource-env-ref-name>
<resource-env-ref-type>lk.ijse.test.tomcatdbcp.Something</resource-env-ref-type>
</resource-env-ref>
</web-app>
package lk.ijse.test.tomcatdbcp;
import java.io.*;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
@WebServlet(name = "helloServlet", value = "/hello", loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
private String message;
@Resource(name= "java:comp/env/bean/Something")
private Something something;
@PostConstruct
public void doSomething(){
System.out.println("Does it work?");
}
public void init() {
message = "Hello World!";
try {
InitialContext ctx = new InitialContext();
Something lookup = (Something) ctx.lookup("java:comp/env/bean/Something");
System.out.println(lookup);
System.out.println(something); // null
} catch (NamingException e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
public void destroy() {
}
}
为了重现同样的问题,我在这里创建了一个示例存储库:
https://github.com/sura-boy-playground/play-with-tomcat10
javax.annotation.Resource
注释,所以我认为这是因为
javax.*
的原因至
jakarta.*
命名空间更改。然后我用
jakarta.annotation.Resource
试了一下但结果是一样的。
javax.*
上尝试了相同的应用程序命名空间,它完美地工作。
最佳答案
您应该声明您的 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
(一个在公共(public)类加载器中,一个在应用程序的类加载器中),这两个类是不同的。
InstanceManager
将查找用公共(public)类加载器的副本
@Resource
注释的字段, 而
something
字段用您的 web 应用程序的副本
@Resource
进行注释.
jakarta.annotation
范围不同于
provided
肯定是一个错误,这可能是一个常见的错误,Tomcat 有一个故障安全功能,它会忽略与您的应用程序一起分发的某些类(参见
source code)。自
jakarta.annotation.*
类不在其中,您可以提交(愿望 list )错误报告。
javax.annotation.*
JRE 中包含的类。 Servlet 容器需要在 bootstrap/JRE 类加载器中查找
之前 查看 webapp 类加载器(覆盖
javax.*
类违反了 Java 的许可证),因此 Tomcat 永远不会找到这些类的附加副本。
关于java - @Resource 注释在 Tomcat 10.0.10 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69249988/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!