首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:在线程内运行时JNDI查找失败

Java:在线程内运行时JNDI查找失败
EN

Stack Overflow用户
提问于 2020-03-17 00:43:25
回答 1查看 374关注 0票数 0

在使用Wildfly 18进行JNDI查找时,我遇到了一个相当奇怪的行为。我有一个简单的EJB:

代码语言:javascript
运行
复制
package com.getronics.ejb;

import javax.ejb.Remote;
import javax.ejb.Local;
import javax.ejb.Stateless;

@Stateless
@Local(ICalculadoraLocal.class)
public class CalculadoraBean implements ICalculadoraLocal {
        public int suma(int a, int b){
               return a+b;
        }
}

通过一个简单的界面:

代码语言:javascript
运行
复制
package com.getronics.ejb;

public interface ICalculadoraLocal{
        int suma(int a, int b);
}

和一个简单的JSP页面来检查它:

代码语言:javascript
运行
复制
<html>
    <body>
            <%@ page import="java.util.Hashtable,javax.naming.*,com.getronics.ejb.*" %>
            request: <%= request.getRequestURI()%><br>
            <%
              final Hashtable jndiProperties = new Hashtable();
              jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
              final Context context = new InitialContext(jndiProperties);
              ICalculadoraLocal calculadora = (ICalculadoraLocal)context.lookup("java:app/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal");
              int suma = calculadora.suma(2,2);
                    %>
                    context: <%= context%></br>
                    2+2= <%=suma%>
    </body>
</html>

这可以很好地工作:

代码语言:javascript
运行
复制
request: /ejb/index.jsp
context: javax.naming.InitialContext@3e532295
2+2= 4

但是,当我尝试使用Thread时,如下所示:

代码语言:javascript
运行
复制
<html>
    <body>
            <%@ page import="java.util.Hashtable,javax.naming.*,com.getronics.ejb.*" %>
            request: <%= request.getRequestURI()%><br>
            <%
                new Thread() {
                    public void run() {
                            try {
                              final Hashtable jndiProperties = new Hashtable();
                              jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
                              final Context context = new InitialContext(jndiProperties);
                              ICalculadoraLocal calculadora = (ICalculadoraLocal)context.lookup("java:app/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal");
                              int suma = calculadora.suma(2,2);
                              System.out.println("suma: " + suma);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        };
                    }.start();
                    %>
    </body>
</html>

它抛出一个NameNotFoundException:

代码语言:javascript
运行
复制
javax.naming.NameNotFoundException: java:app/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal

有什么想法可以解释为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-17 19:22:08

似乎使用"global“而不是"app”可以让它工作:

代码语言:javascript
运行
复制
ICalculadoraLocal calculadora = (ICalculadoraLocal)context.lookup("java:global/ear-0.0.0.0.0.1/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal");

原因似乎是"app“、"module”和"comp“的JNDI查找在这些线程中不起作用。

您可以查看以下链接以了解更多信息:

jndi lookup fails in user-thread

[jboss-as7-dev] Issue with access to java:comp/UserTransaction from non EE threads

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60709911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档