2015-01-24 6 views
2
내가 임베디드 톰캣과 스프링 부팅을 사용하여 JNDI를 사용하려고 시도하지만, 다음과 같은 오류를 얻고있다

로 Tomcat을 내장 사용 도움말은 크게 감사하겠습니다. 당신은 인 JndiObjectFactoryBean에 false로 lookupOnStartup 설정해야봄 부팅 JNDI

@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

:

여기 내 코드입니다.

또는 시작 중에 작동하도록 조회가 필요한 경우 this answer 일 수 있습니다.

편집 : 또한 JndiObjectFactory 콩의 JNDI 이름을 잘못 설정했습니다. java:comp/env/jdbc/myDataSource이 아닌 jdbc/dataSource이어야합니다.

자원을 조회 할 때 등록 할 때와 등록 할 때 다른 이름을 사용하면 자동으로 자원이 java:comp/env/ 아래에 배치됩니다.

+0

흠 아직도 운이 없습니다. 일부 메소드가 사용되지 않으므로 몇 줄을 수정해야했습니다. classLoader 가져 오기 : ClassUtils.overrideThreadContextClassLoader (context.getClass(). getClassLoader()); 및 여전히 위와 같은 오류가 나타납니다. 어떤 아이디어? – shep519

+0

조회를 수행 할 때 잘못된 JNDI 이름을 사용하고 있습니다. 자세한 내용은 내 편집을 참조하십시오. –

+0

나는 또한 그걸 시도해 봤지만, setResourceRef를 true로 설정하면 자동으로 "java :"문자열을 추가해야한다고 생각하지 않지만 어느 쪽이든 여전히 동일한 오류가 발생합니다. – shep519

0

스프링 부트를 사용하는 경우 해당 클래스가 모두 필요하지 않습니다. 그것은 이미 @EnableAutoConfiguration 구성 또는 @SpringBootApplication

그냥 application.yml 파일에 당신의 application.xml을 파일 또는 동등한에 다음을 넣어

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