Может быть, это общий вопрос, я пытаюсь создать сессию без учета состояния EJB 3.0 с ссылкой на ресурсы для источника данных в Websphere 7.0.ссылка на ресурс в EJB3
Следующий код работает:
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>
Следующий код не работает и дает мне excpetion
javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".
Но не уверен, как действовать, когда Источнику данных нужно искать в исходнойконтексте вне EJB.
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: комп/ENV /» в источнике данных поиска, то он работает нормально, но это не является хорошей практикой.
ОБНОВЛЕНИЕ: Спасибо за ответы. Моя цель - заменить существующий EJB 2.1 на EJB 3.0. Текущий EJB 2.1 разработан аналогично фрагменту кода 2, поэтому я написал этот тест. EJB 2.1 работает с выделенной ресурсами частью ejb (но имеет ссылку на ресурс, объявленную в ejb-jar.xml). Если я не буду следовать тому же подходу, то это будет иметь огромное влияние, которого я хочу избежать.
Спасибо за ответ. Я согласен, что мне нужно использовать JNDI-имя, но не знаю, как это сделать во втором фрагменте кода, который у меня был. – user2104750
Если вы используете EJB, просто используйте аннотацию для доступа к ресурсу именно то, что вы сделали в первый раз. То, что вы делаете, - плохая практика. Поскольку EJB загружается и поддерживается в контейнере. Нет никакой гарантии, что DataSource POJO будет загружаться загрузчиком класса до того, как EJB сделает вызов. Оба имеют разные жизненные циклы. Поэтому пусть контейнер вставляет ресурс для вас. Это правильная практика. Таким образом, EJB зависит от POJO - это плохая практика. Не рекомендуется в J2EE. С уважением, Рави. –