繁体   English   中英

在WildFly中,如何在EJB 2.x中将数据源资源引用名称映射到JNDI名称?

[英]How to map a DataSource Resource Ref Name to JNDI Name in EJB 2.x in WildFly?

在WildFly中,如何在EJB中将数据源资源引用名称映射到JNDI名称?

我知道在JBoss 4.2.3中它是在jboss.xml完成的,但在WildFly中不起作用。

这是我的测试:

我正在使用Eclipse Luna中的Java 1.7,XDoclet 1.2.3,WildFly 8.2.1.Final,动态Web模块2.5,EJB 2.1。

在WildFly中,我有一个名为SchedulerDS的数据源,其JNDI名称为java:jboss/datasources/SchedulerDS 它正在使用jTDS JDBC驱动程序并连接到MS SQL Server 2008 R2数据库。

在Eclipse中,我创建了以下项目:

  1. 一个名为Z01_EAR的企业应用程序项目。
  2. 一个名为Z01_WAR的动态Web项目。
  3. 一个名为Z01_EJB的EJB项目。
  4. 一个名为Z01_EJBClient的EJB客户端项目。

在Z01_EJB项目中,我创建了一个名为SLS01的XDoclet无状态会话Bean(EJB 2.1)。 在其中定义一个名为jdbc/chumbo的数据源资源引用。 并且我将其映射定义为JNDI名称java:jboss/datasources/SchedulerDS

这是ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1">
   <description><![CDATA[Z01_EJB generated by eclipse wtp xdoclet extension.]]></description>
   <display-name>Z01_EJB</display-name>
   <enterprise-beans>
      <session id="Session_SLS01">
         <description><![CDATA[An EJB named SLS01]]></description>
         <display-name>SLS01</display-name>
         <ejb-name>SLS01</ejb-name>
         <home>com.z01.ejb.SLS01Home</home>
         <remote>com.z01.ejb.SLS01</remote>
         <local-home>com.z01.ejb.SLS01LocalHome</local-home>
         <local>com.z01.ejb.SLS01Local</local>
         <ejb-class>com.z01.ejb.SLS01Session</ejb-class>
         <session-type>Stateless</session-type>
         <transaction-type>Container</transaction-type>
         <resource-ref id="ResRef_1">
            <res-ref-name>jdbc/chumbo</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
         </resource-ref>
      </session>
   </enterprise-beans>
   <assembly-descriptor id="AssemblyDescriptor_1">
   </assembly-descriptor>
   <ejb-client-jar>Z01_EJBClient.jar</ejb-client-jar>
</ejb-jar>

这是jboss.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">
<jboss>
   <enterprise-beans>
      <session>
         <ejb-name>SLS01</ejb-name>
         <jndi-name>SLS01</jndi-name>
         <local-jndi-name>SLS01Local</local-jndi-name>
         <resource-ref>
            <res-ref-name>jdbc/chumbo</res-ref-name>
            <jndi-name>java:jboss/datasources/SchedulerDS</jndi-name>
         </resource-ref>
        <method-attributes>
        </method-attributes>
      </session>
   </enterprise-beans>
   <assembly-descriptor>
   </assembly-descriptor>
   <resource-managers>
   </resource-managers>
</jboss>

在EJB中,我编写了一种测试方法

public void testRetrieve() {

    String dataSourceLookupString = null;
    InitialContext initialContext = null;
    DataSource dataSource = null;       
    Connection connection = null;
    String sql = null;
    Statement statement = null;
    ResultSet resultSet = null;
    long employeeId = -1;


    try {
        dataSourceLookupString = "java:comp/env/jdbc/chumbo";           
        initialContext = new InitialContext();
        dataSource = (DataSource) initialContext.lookup(dataSourceLookupString);
        connection = dataSource.getConnection();
        sql = "select top 1 employee_id from employee";
        statement = connection.createStatement();           
        resultSet = statement.executeQuery(sql);            
        if (resultSet != null && resultSet.next()) {
            employeeId = resultSet.getLong(1);
            System.out.println("testRetrieve(): employeeId=" + employeeId);
        }           
    } catch (NamingException e) {
        e.printStackTrace();            
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (statement != null) {
                statement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();                
        }
    }       
}

它不起作用,我得到了这个错误:

2015-12-14 18:54:50,403错误[stderr](MSC服务线程1-6)org.h2.jdbc.JdbcSQLException:未找到表“ EMPLOYEE”; SQL语句:2015-12-14 18:54:50,403错误[stderr](MSC服务线程1-6)从员工[42102-173]中选择前1名employee_id 2015-12-14 18:54:50,403错误[stderr] (org服务在org.h2.message.DbException.getJdbcSQLException(DbException.java:331)(MSC服务线程1-6)2015-12-14 18:54:50,403错误[stderr](MSC服务线程1-6)在组织。 h2.message.DbException.get(DbException.java:171)2015-12-14 18:54:50,403 org.h2.message.DbException.get(DbException.java)错误[stderr](MSC服务线程1-6) :148)2015-12-14 18:54:50,403错误[stderr](MSC服务线程1-6)在org.h2.command.Parser.readTableOrView(Parser.java:4864)2015-12-14 18:54 :org.h2.command.Parser.readTableFilter(Parser.java:1107)上的:50,403错误[stderr](MSC服务线程1-6)2015-12-14 18:54:50,403错误[stderr](MSC服务线程1 -6)at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1713)2015-12-14 18:54:50,403 org.h2.command.Parser出现错误[stderr](MSC服务线程1-6) .parseSelectSimple(Parser.j ava:1821)2015-12-14 18:54:50,403错误[stderr](MSC服务线程1-6)在org.h2.command.Parser.parseSelectSub(Parser.java:1707)2015-12-14 18: org.h2.command.Parser.parseSelectUnion(Parser.java:1550)上的54:50,403错误[stderr](MSC服务线程1-6)2015-12-14 18:54:50,403错误[stderr](MSC服务线程1-6),位于org.h2.command.Parser.parseSelect(Parser.java:1538)2015-12-14 18:54:50,403错误[stderr](MSC服务线程1-6)位于org.h2.command。 Parser.parsePrepared(Parser.java:405)2015-12-14 18:54:50,403 org.h2.command.Parser.parse(Parser.java:279)出现错误[stderr](MSC服务线程1-6) org.h2.command.Parser.parse(Parser.java:251)上的-12-14 18:54:50,419错误[stderr](MSC服务线程1-6)2015-12-14 18:54:50,419错误[ stderr](MSC服务线程1-6)位于org.h2.command.Parser.prepareCommand(Parser.java:218)2015-12-14 18:54:50,419错误[stderr](MSC服务线程1-6)位于org.h2.engine.Session.prepareLocal(Session.java:428)2015-12-14 18:54:50,419错误[stderr]( org.h2.engine.Session.prepareCommand(Session.java:377)上的MSC服务线程1-6)2015-12-14 18:54:50,419 org.h2上的错误[stderr](MSC服务线程1-6) .jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1138)2015-12-14 18:54:50,419 org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:[stderr](MSC服务线程1-6)错误: 72)2015-12-14 18:54:50,419 org.jboss.jca.adapters.jdbc.WrappedStatement.executeQuery(WrappedStatement.java:344)出现错误[stderr](MSC服务线程1-6)2015-12-14 18:54:50,419在com.z01.ejb.SLS01Bean.testRetrieve(SLS01Bean.java:197)上出现[stderr](MSC服务线程1-6)

现在,我将代码更改为直接查找JNDI名称:

dataSourceLookupString = "java:jboss/datasources/SchedulerDS";

而且效果很好。 因此,这意味着jboss.xml在我的情况下不起作用。 在这种情况下,如何将数据源资源引用名称映射到JNDI名称?

谢谢

弄清楚,对于WildFly,我必须使用jboss-ejb3.xml而不是jboss.xml

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM