2016-01-18 2 views
1

Я снова искал эту проблему, где я не могу найти базу данных jndi с помощью java config. До этого я использую xml и его работу отлично, но в java config это вызывает проблему;Weblogic jndi NameNotFoundException происходит с конфигурацией java

код Xml:

 <!-- Jndi database connection --> 
    <jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}" 
    resource-ref="true" /> 

    <beans:bean id="jdbcTemplate" 
    class="org.springframework.jdbc.core.JdbcTemplate" > 
    <beans:property name="dataSource" ref="dbDataSource"></beans:property> 
    </beans:bean> 

Java конфигурации Теперь:

@Bean(name = "dbDataSource") 
public DataSource dataSource(@Value("${db.jndi}") String jndiName) 
{ 
    JndiDataSourceLookup lookup = new JndiDataSourceLookup(); 
    return lookup.getDataSource(jndiName); 
} 

@Bean 
public JdbcTemplate jdbcTemplate(DataSource ds) { 
    return new JdbcTemplate(ds); 
} 

Свойства Имя файла:

db.jndi=jndi/myData 

JNDI в WebLogic:

jndi/myData 

После изменения в Java конфигурацию, иногда система может прочитать базу данных, но встречается редко, пока я не очистить и перезагрузить компьютер, то он может найти базу данных, но обычно его всегда вызывает:

javax.naming.NameNotFoundException: Unable to resolve 'jndi.myData'. Resolved 'jndi'; remaining name 'myData'

Почему приложение не может найти базу данных правильно? Спасибо !!!

ответ

0

Похоже, что ваш источник данных не был развернут. Вы должны искать дерево JNDI для сервера, на котором вы пытались развернуть источник данных. (https://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/taskhelp/jndi/ViewObjectsInTheJNDITree.html) Если вы не видите «jndi.myData» в дереве JNDI, вы можете предположить, что ваш источник данных не был развернут. Таким образом, вы можете перейти на вкладку мониторинга источников данных и протестировать источник данных. (https://docs.oracle.com/cd/E17904_01/apirefs.1111/e13952/taskhelp/jdbc/jdbc_datasources/TestDataSources.html)

+0

уже пробовал, но webapp все еще не может найти его, и иногда он работает, как обычно, но когда я вернусь обратно к xml, он работает так же, как и обычный ~ – FreezY

+0

Возможно, мне нужно добавить что-то в java config? – FreezY

+0

Вы можете подключить свою базу данных с настройками, введенными в пул соединений? Вы можете попробовать с помощью TOAD. И, наконец, вы можете найти «» в ваших журналах сервера? Это где-то должно быть написано ошибка. – BurakE

4

У меня была та же проблема. Если вы используете 4.x версию весны, это, вероятно, причина.

Вы также должны check Weblogic's JNDI Tree. Если исходные данные disapears из дерева после восстановления проекта, это еще один симптом

Если это так, то, что происходит это:

Ваш Datasource реализует закрывающиеся (и, следовательно, AutoCloseable) и контекст всегда будет вызывать метод отключения независимо от определения Bean

, как показано здесь: SPR-12551: Document how to prevent a JNDI DataSource retrieved using JavaConfig to be removed on shutdown of the context

это было отмечено как проблема документации, как это т он «ожидаемое» поведение:

Этот вопрос был исключительно о документации, так как мы решили не реализовывать что-либо на уровне рамочного

решение, чтобы определить уничтожить метод бина, как пустой, такие как:

@Bean(name = "dbDataSource", destroyMethod="") 
    public DataSource dataSource(@Value("${db.jndi}") String jndiName) 
{ 
JndiDataSourceLookup lookup = new JndiDataSourceLookup(); 
    return lookup.getDataSource(jndiName); 
} 

@Bean 
public JdbcTemplate jdbcTemplate(DataSource ds) { 
    return new JdbcTemplate(ds); 
} 

Это описано в этом issue (SPR-13022:Destroy callback cannot be disabled for AutoCloseable beans).

PS: Кстати, это похоже на раннюю версию весны 4.x, вы не можете переопределить это поведение, установив метод destroyMethod. Предполагается, что эта ошибка была исправлена ​​на версии 4.2 RC1.

+0

После нескольких тестов проблема все еще сохраняется, но, по крайней мере, у меня есть проблема. Кажется, что мой источник данных держится и удаляет имя jndi. Тогда мне нужно продолжить исследование. Благодаря! – FreezY

+0

Является ли этот источник данных общим? Возможно, есть другое приложение, разрушающее источник данных. –

+0

Nop, я нахожусь в разработке, и только я его использую – FreezY

0

У меня была такая же проблема, и я решил проблему. Я использовал jndi datasource на weblogic. После того, как я перезапустил приложение, я заметил, что мой источник jndi datasource удаляется из дерева JNDI Weblogic. Конфигурация Xml работает успешно, но java-конфигурация не работает.

Моя старая весна версия: 4.1.6.RELEASE Обновление до 4.3.9.RELEASE

конфигурации Xml, как это;

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName"> 
       <value>${db-jndi.name}</value> 
     </property> 
</bean> 

Конфигурация Java как это;

@Bean(name = "dataSource") 
public DataSource dataSource() throws IllegalArgumentException, NamingException 
{ 
    JndiTemplate jndiTemplate = new JndiTemplate(); 
    DataSource dataSource = (DataSource) jndiTemplate.lookup(env.getProperty("db-jndi.name")); 
    logger.info("DataSource initialized in jndi ");   
    return dataSource; 
} 

Тогда я изменил

@Bean(name = "dataSource") 

в

@Bean(name = "dataSource", destroyMethod = "") 

И это работает успешно.

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