2013-04-10 4 views
0

Может быть, это общий вопрос, я пытаюсь создать сессию без учета состояния 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). Если я не буду следовать тому же подходу, то это будет иметь огромное влияние, которого я хочу избежать.

ответ

0

Вам нужно будет использовать JNDI-имя (то есть: java: comp/env/jdbc/myDataSource) ресурса, находящегося на сервере. Имя JNDI является уникальным идентификатором ресурса. Нет другого способа, независимо от того, является ли он автономным java или контейнером java. Если вы используете EJB, вы можете использовать аннотации и ссылаться на ресурс, но все же ресурс будет искать ваши файлы привязки, где вы упомянули имя JNDI. Так или иначе вам придется использовать JNDI-имя ресурса.

Ответ Обновлено

Если вы используете EJB, то просто использовать аннотацию для доступа к ресурсу именно то, что вы сделали в первый раз. То, что вы делаете, - плохая практика. Поскольку EJB загружается и поддерживается в контейнере. Нет никакой гарантии, что DataSource POJO будет загружаться загрузчиком класса до того, как EJB сделает вызов. Оба имеют разные жизненные циклы. Поэтому пусть контейнер вставляет ресурс для вас. Это правильная практика. Таким образом, EJB зависит от POJO - это плохая практика. Не рекомендуется в Java EE.

+0

Спасибо за ответ. Я согласен, что мне нужно использовать JNDI-имя, но не знаю, как это сделать во втором фрагменте кода, который у меня был. – user2104750

+0

Если вы используете EJB, просто используйте аннотацию для доступа к ресурсу именно то, что вы сделали в первый раз. То, что вы делаете, - плохая практика. Поскольку EJB загружается и поддерживается в контейнере. Нет никакой гарантии, что DataSource POJO будет загружаться загрузчиком класса до того, как EJB сделает вызов. Оба имеют разные жизненные циклы. Поэтому пусть контейнер вставляет ресурс для вас. Это правильная практика. Таким образом, EJB зависит от POJO - это плохая практика. Не рекомендуется в J2EE. С уважением, Рави. –

0

Замените @Resource на @Resource(name="jdbc/myDataSource"), и он должен работать.

+0

Код с аннотациями работает хорошо, проблема связана со вторым фрагментом кода, который ищет источник данных за пределами EJB ... – user2104750

+0

Да, и изменение аннотации гарантирует, что имя JNDI - это то, что вы ожидаете в другом фрагменте кода. –

+0

Прошу прощения, я не уверен, где вы просите меня заменить аннотацию. В фрагменте кода 2 я использовал только аннотацию @Stateless. Если возможно, вы можете предоставить мне код? – user2104750

Смежные вопросы