EJB3中的资源引用

时间:2013-04-10 21:20:24

标签: websphere ejb-3.0 resourcereference

可能这是一个常见的问题,我正在尝试使用Websphere 7.0中的数据源创建一个无状态会话EJB 3.0和资源引用。

以下代码正在运行:

package com;
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.sql.DataSource;
@Stateless
public class Test1 implements Test1Remote {
 @Resource DataSource ds;
 public Test1() {}
 public boolean testDs() {
  boolean valid = true;
  try {
   ds.getConnection();
  } catch (Exception e) {
   e.printStackTrace();
   valid = true;
  }
  return valid;
 }
}


<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-bnd
    xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee 
    http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd" version="1.0">

    <session name="Test1">
     <interface class="com.Test1Remote" binding-name="Test1"/>
     <resource-ref name="com.Test1/ds" binding-name="jdbc/myDataSource"></resource-ref>
    </session>
</ejb-jar-bnd>

以下代码无法正常工作并给予我激励

javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".

但是当需要在EJB的initialContext out side中查找数据源时,不确定如何继续。

package com;
import javax.ejb.Stateless;
@Stateless
public class Test1 implements Test1Remote {
    public Test1() {
    }
    public boolean testDs(){
     boolean valid = true;
     try {
         MyConnection ds = new MyConnection();
         ds.getConnection();
     } catch (Exception e) {
        e.printStackTrace();
        valid = true;
    }
    return valid;
    }
}

package com;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;


public class MyConnection{
    private DataSource ds;
    public Object getConnection() throws Exception  {
 try {
    final InitialContextinitCtx = new InitialContext();
    ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/myDataSource");
    return ds.getConnection();
    } catch (NamingException e) {
     e.printStackTrace();
     throw e;
    } catch (SQLException e) {
     e.printStackTrace();
     throw e;
    }
 }
}

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-bnd
    xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee 
    http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd" version="1.0">

    <session name="Test1">
     <interface class="com.Test1Remote" binding-name="Test1"/>
    </session>
</ejb-jar-bnd>

如果我在数据源查找中不使用“java:comp / env /”那么它工作正常,但这不是一个好习惯。

更新:感谢您的回复。我的目标是将现有的EJB 2.1替换为EJB 3.0。当前的EJB 2.1设计类似于代码片段2所以我编写了这个测试。 EJB 2.1与ejb外部定义的资源一起运行(但是在ejb-jar.xml中声明了资源引用)。如果我不遵循相同的方法,那么它将产生巨大的影响,我想避免。

2 个答案:

答案 0 :(得分:0)

您必须使用驻留在服务器中的资源的JNDI名称(即:java:comp / env / jdbc / myDataSource)。 JNDI名称是资源的唯一标识符。没有其他方法是独立的java还是容器驱动的java。如果您正在使用EJB,那么您可以使用注释并引用资源,但仍然会在您提到JNDI名称的绑定文件中查找资源。无论如何,您将不得不使用资源的JNDI名称。

回答已更新

如果您正在使用EJB,那么只需使用注释来访问您第一次完成的资源。你在做什么是一种不好的做法。因为EJB是在容器中加载和维护的。在EJB调用之前,没有任何关于DataSource POJO将由类加载器加载的保证。两者都有不同的生命周期。所以让容器为你注入资源。这是正确的做法。所以EJB依赖于POJO是一种不好的做法。不建议在Java EE中使用。

答案 1 :(得分:0)

@Resource替换为@Resource(name="jdbc/myDataSource"),它应该有效。