5

当我在我的代码中尝试以下查找时:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
return (DataSource) envCtx.lookup("jdbc/mydb"); 

我得到以下异常:

java.sql.SQLException: QueryResults: Unable to initialize naming context: 
    Name java:comp is not bound in this Context at 
    com.onsitemanager.database.ThreadLocalConnection.getConnection
    (ThreadLocalConnection.java:130) at     
    ...

我按照 JBoss wiki 说明安装了嵌入式 JBoss 。我使用配置 wiki 页面中指定的“默认扫描每个 WAR”部署来配置 Tomcat 。

引用配置页面:

JNDI

嵌入式 JBoss 组件(如连接池、EJB、JPA 和事务)广泛使用 JNDI 来发布服务。嵌入式 JBoss 通过将自身置于 Tomcat 的 JNDI 实例之上来覆盖 Tomcat 的 JNDI 实现。> 原因有以下几点:

  1. 为了避免必须在 server.xml 中声明这些服务中的每一项
  2. 允许在 Web 应用程序和 EJB 之间无缝集成 java:comp 命名空间。
  3. Tomcat 的 JNDI 实现中存在一些严重的错误,这些错误会妨碍某些 JBoss 组件的工作能力
  4. 我们希望为您提供远程 EJB 和其他可以远程查找的服务的选项

任何人对我如何配置 JBoss 命名服务有任何想法,根据上面的引用,它会覆盖 Tomcat 的 JNDI 实现,以便我可以在 java:comp/env 上进行查找?

仅供参考 - 我的环境 Tomcat 5.5.9,Seam 2.0.2sp,嵌入式 JBoss(Beta 3),

注意:我确实有一个 -ds.xml 文件,用于根据说明正确设置并在类路径上访问我的数据库连接。

另请注意:我已经在嵌入式 Jboss 论坛和 seam 用户论坛中发布了这个问题。

4

3 回答 3

2

感谢您的响应工具包....是的,我可以通过直接访问 java:jdbc/mydb 来访问我的数据源,但我使用的是通过 ENC 连接的现有代码库。这是我发现的一些有趣的信息......

  1. 上面的代码适用于JBoss 4.2.2.GA,这里是使用的 JNDI ctx 参数:
    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming :org.jnp.interfaces: org.jboss.naming:org.jnp.interfaces

  2. 上面的代码适用于Tomcat 5.5.x,这里是使用的 JNDI ctx 参数:
    java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory java.naming.factory.url.pkgs=org.apache.naming

  3. 上述代码在 Tomcat 5.5.x 中使用Embedded JBoss (Beta 3)失败,并显示上述错误消息。
    java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory java.naming.factory.url.pkgs=org.apache.naming上面的代码在tomcat 5.5.x中使用JBoss Embedded时出现上述错误

有人对我配置嵌入式 JBoss JNDI 配置需要做什么有任何想法吗?

于 2008-09-23T19:33:23.830 回答
1

java:comp/env 被称为企业命名上下文 (ENC),它不是全局可见的。请参阅此处了解更多信息。您将需要找到您的数据源注册所在的全局 JNDI 名称。

最简单的方法是导航到 JBoss 的基于 Web 的 JMX 控制台并查找“JNDIView”(不完全确定名称 - 目前在家里)mbean。这个 mbean 应该有一个可以调用的 list 方法,它将显示所有 JNDI 绑定对象的上下文路径。

于 2008-09-23T18:26:31.027 回答
1

我在 Jboss Embedded 上遇到了一些类似的问题,我终于修复了在文件中播放的问题:test-Datasource-ds.xml

添加

<mbean code="org.jboss.naming.NamingAlias" name="jboss.jmx:alias=testDatasource">
    <attribute name="FromName">jdbc/Example DataSource</attribute>
    <attribute name="ToName">java:/testDatasource</attribute>
</mbean>

问题是 jboss 为声明的所有数据源添加前缀 java:/。所以最后我有一个名为 testDatasource 的数据源,用 jdbc/Example DataSource 的指令覆盖

希望它有效

于 2011-06-07T10:58:22.473 回答