2017-02-03 2 views
0

Когда мое приложение попыталось подключиться к базе данных через источник данных с помощью jndi, это показывает, что мой источник данных имеет значение NULL. ниже приведен весь соответствующий код.Ошибка инициализации datasource во свободе

XML файл

<?xml version="1.0" encoding="UTF-8"?> 
    <server description="data source configuration"> 
     <dataSource id="sybase" 
        jndiName="jdbc/sybase" 
        type="javax.sql.DataSource" 
     > 
      <jdbcDriver> 
       <library> 
        <fileset dir="${ibs.dbdrivers.dir}" includes="jconn3.jar"/> 
       </library> 
      </jdbcDriver> 

      <properties.sybase databaseName="XXX" URL="jdbc:sybase:Tds:XXX:5000"/> 
      <recoveryAuthData user="XX" password="XX"/> 
     </dataSource> 
    </server> 

класс Configration

@Configuration 
public class SybaseDataConfig { 

    @Bean 
    public DataSource localDataSource() { 
    JndiTemplate jndi = new JndiTemplate(); 
    try { 
     return (DataSource) jndi.lookup("java:comp/env/jdbc/sybase"); 
    } catch (NamingException e) { 
     throw new BeanCreationException("dataSource", "Error looking up data source", e); 
    } 
    } 
} 

DAOimp класс

public class DAOimp implements IDAOimp{ 

    private JdbcTemplate jdbcTemplate; 

    private SybaseDataConfig sybase; 
    @Autowired 
    public void setDataSource(DataSource dataSource) { 
    this.jdbcTemplate = new JdbcTemplate(sybase.localDataSource()); 
    } 
    //some code 

} 

IBM-веб-bnd.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-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-web-bnd_1_0.xsd" 
     version="1.0"> 
    <virtual-host name="default_host"/> 
    <resource-ref name="jdbc/sybase" binding-name="jdbc/sybase"/> 
</web-bnd> 

web.xml

<resource-ref> 
     <res-ref-name>jdbc/sybase</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 

, когда мой контроллер вызова метода в классе daoimpl, это говорит о том, что источник данных является недействительным. могу я знать, что не так и что такое решение. благодарим заранее!

UPDATE:

<featureManager> 
     <feature>webProfile-6.0</feature> 
     <feature>jpa-2.0</feature> 
     <feature>ssl-1.0</feature> 
     <feature>localConnector-1.0</feature> 
     <feature>jdbc-4.0</feature> 
    </featureManager> 
+2

Невозможно использовать @Resource и вводить DataSource, где вам это нужно, а не все эти весенние вещи ?? – Gas

+0

@ Gas same..i использовать ресурс, но он также не смог найти jndiname – fishermanfriends

+0

. Добавить full'erver.xml' на вопрос или хотя бы часть функций. У вас есть функции jdbc и jndi? – Gas

ответ

2

Для того, чтобы сузить причину проблемы, подтвердите, что конфигурация сервера XML является действительной (он выглядит правильно), временно переключиться на прямой поиск:

return (DataSource) javax.naming.InitialContext.doLookup("jdbc/sybase"); 

Если вы не удались, вы должны увидеть исключение, которое поможет определить причину или общее исключение именования, и в этом случае проверьте журналы сервера на наличие каких-либо предупреждений или ошибок.

Если успешно, то убедитесь, что ваш дескриптор развертывания и привязок правильны временно переключиться на косвенном поиска,

return (DataSource) javax.naming.InitialContext.doLookup("java:comp/env/jdbc/sybase"); 

В случае успеха, вам нужен кто-то с весны опытом, чтобы ответить на этот вопрос.

Если неудачно, дескриптор развертывания или привязки могут быть некорректными (они выглядят корректно) или помещены в неправильном месте (они принадлежат WEB-INF), или, возможно, метод localDataSource может не работать в потоке, который связан с веб-модулем, к которому относятся привязки.

+0

Когда я перемещаю компонент компонента моей конфигурации в класс службы, появляется сообщение об ошибке «javax.naming.NoInitialContextException: необходимо указать имя класса в среде или системном свойстве или в качестве параметра апплета или в ресурсе приложения файл: java.naming.factory.initial ". я разделил jndiName в web.xml и ibm-web-bnd.xml. Я не знаю, что здесь не так. – fishermanfriends

+0

Просто напишите простой сервлет с этими поисковыми запросами для тестирования. Или даже лучше создать отдельный проект/приложение, без каких-либо родственных библиотек. – Gas

+0

Если вы получаете NoInitialContextException, то вы почти наверняка не работаете в потоке веб-контейнера. Выполнение контекста потока веб-контейнера является обязательным требованием доступа к ссылке на ресурс, которую вы определили в web.xml. Похоже, нам понадобится кто-то, кто знает о Spring, чтобы ответить на вопрос, как подключить @ Configuration/@ Bean до запроса веб-контейнера, который позволит вам определить ссылки ресурсов, которые вы определили. – njr

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