2015-01-24 14 views
2

Я использую Spring Ботинки с Embedded Tomcat и пытаюсь использовать JNDI, но получаю следующее сообщение об ошибке:Spring загрузки с помощью встроенного сервера Tomcat с JNDI

javax.naming.NameNotFoundException: Имя [JDBC/DataSource]

Любых советы были бы весьма признательны.

Вот мой код:

@Configuration 
public class TomcatJndiConfiguration{ 

@Value("${database.driver}") 
private String driverClassName; 

@Value("${database.url}") 
private String databaseUrl; 

@Value("${database.username}") 
private String databaseUsername; 

@Value("${database.password}") 
private String databasePassword; 

@Bean 
public TomcatEmbeddedServletContainerFactory tomcatFactory() { 
    return new TomcatEmbeddedServletContainerFactory() { 

     @Override 
     protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
       Tomcat tomcat) { 
      tomcat.enableNaming(); 
      return super.getTomcatEmbeddedServletContainer(tomcat); 
     } 

     @Override 
     protected void postProcessContext(Context context) { 
      ContextResource resource = new ContextResource(); 
      resource.setName("jdbc/dataSource"); 
      resource.setType(DataSource.class.getName()); 
      resource.setProperty("driverClassName", driverClassName); 
      resource.setProperty("url", databaseUrl); 
      resource.setProperty("password", databaseUsername); 
      resource.setProperty("username", databasePassword); 
      context.getNamingResources().addResource(resource); 
     } 
    }; 
} 

@Bean 
public DataSource dataSource() throws IllegalArgumentException, NamingException { 
    JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); 
    bean.setJndiName("jdbc/dataSource"); 
    bean.setLookupOnStartup(true); 
    bean.setProxyInterface(DataSource.class); 
    bean.setResourceRef(true); 
    bean.afterPropertiesSet(); 
    return (DataSource) bean.getObject(); 

} 
Stacktrace is: 
Caused by: javax.naming.NameNotFoundException: Name [jdbc/dataSource] is not bound in this Context. Unable to find [jdbc]. 
at org.apache.naming.NamingContext.lookup(NamingContext.java:818) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:157) 
at javax.naming.InitialContext.lookup(InitialContext.java:417) 
at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155) 
at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87) 
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152) 
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179) 
at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95) 
at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:106) 
at org.springframework.jndi.JndiObjectTargetSource.afterPropertiesSet(JndiObjectTargetSource.java:97) 
at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.createJndiObjectProxy(JndiObjectFactoryBean.java:318) 
at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.access$000(JndiObjectFactoryBean.java:307) 
at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:200) 
at com.kronos.daas.configuration.TomcatJndiConfiguration.dataSource(TomcatJndiConfiguration.java:72) 
+0

Уже ответил здесь: http://stackoverflow.com/questions/24941829/how-to-create-jndi-context-in-spring-boot-with-embedded-tomcat-container/26005740 # 26005740 – nekperu15739

ответ

1

Вы должны установить lookupOnStartup ложь на JndiObjectFactoryBean.

В качестве альтернативы, если вам нужен поиск для работы во время запуска, то может представлять интерес this answer.

Редактировать: Вы также неправильно указали имя JNDI на своем JndiObjectFactory компонентах. Это должно быть java:comp/env/jdbc/myDataSource не jdbc/dataSource.

Вы используете другое имя при поиске ресурса по сравнению с тем, когда вы зарегистрировали его, поскольку регистрация автоматически помещает ресурс ниже java:comp/env/.

+0

Хмм еще не повезло. Пришлось модифицировать несколько строк, поскольку некоторые методы устарели. Получить классLoader: ClassUtils.overrideThreadContextClassLoader (context.getClass(). GetClassLoader()); и я все еще получаю ту же ошибку, что и выше. Есть идеи? – shep519

+0

Вы используете неправильное имя JNDI при выполнении поиска. См. Мое редактирование для более подробной информации. –

+0

Я тоже пробовал это, но я не считаю, что имеет значение, если я устанавливаю setResourceRef в true, он должен автоматически добавлять строку «java:», но в любом случае я все равно получаю ту же ошибку – shep519

0

Если вы используете весеннюю ботинок, вам не нужен весь этот класс. Он уже настроен в @EnableAutoConfiguration или @SpringBootApplication

Просто поместите в файл application.xml или эквивалент в application.yml файле

spring.datasource.driverClassName=JDBCDriverClassName 
spring.datasource.url=databaseUrl 
spring.datasource.username=databaseUsername 
spring.datasource.password=databasePassword 
spring.datasource.jndi-name=java:jdbc/dataSource 

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

  • Нет связанных вопросов^_^