我正在尝试使用 GlobalNamingResources 创建一个全局 bean,它将由 2 个不同的 webapps(当然在同一个 tomcat 上)使用。
我的问题是,当我尝试将新数据设置到从 JNDI 获得的类时,我得到了 NullPointerException。
我点击了以下链接,但我仍然不确定我做错了什么: http://tomcat.apache.org/tomcat-7.0-doc/config/globalresources.html
这是使我的 servlet 崩溃的行:
single.setText("TEXT");
这是我的测试 servlet:
@WebServlet("/JNDIServlet")
public class JNDIServlet extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Thread.sleep(4000);
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
SingletonClass single = (SingletonClass) envCtx.lookup("TestMe");
single.setText("TEXT");
initCtx.rebind("TestMe", single);
response.getWriter().println(envCtx.lookup("TestMe").toString());
} catch (NamingException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我的“SingletonClass”只是一个 pojo:
package com.jndi.test;
public class SingletonClass {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public SingletonClass() {
}
}
这是我的 web.xml 文件:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>JNDIServletTest</display-name>
<resource-ref>
<res-ref-name>TestMe</res-ref-name>
<res-type>com.jndi.test.SingletonClass</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
最后,来自 tomcat 的 server.xml 文件中的相关部分:
<GlobalNamingResources>
<Resource name="TestMe" auth="Container"
type="com.jndi.test.SingletonClass"
factory="org.apache.naming.factory.BeanFactory"/>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
另外,我在 tomcat 的 context.xml 中添加了所需的资源链接:
<ResourceLink name="TestMe" global="TestMe" type="com.jndi.test.SingletonClass"/>
谁能告诉我我做错了什么?
非常感谢:)
最佳答案
[已解决]
第 1 部分:
在 webapp 的 context.xml
的 ResourceLink
中,使用与 global
不同的
name
在 server.xml
Resource
定义的 >name
第 2 部分:
从 webapp's-lib 中删除资源 bean 的重复实现 JAR/类,并将那些放在 tomcat 库中。
第 2 部分解释:
就我而言,我在一个单独的包中创建了一个工厂并将其打包为一个 JAR。我在 webapp 的库和 tomcat 库中都使用了 JAR。
这导致了 ClassCastException
(因为资源是用 tomcat 的版本类创建的 - 然后应用程序试图将它转换为来自它自己的库的类 [如果有兴趣,请阅读更多有关 tomcat 中的 ClassLoaders 的信息,这将使事情变得更加清晰])。
关于java - Tomcat JNDI 返回 null 而不是 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14030800/