run how deploy change application and spring-boot jndi embedded-tomcat-8

how - Spring Boot usando Embedded Tomcat con JNDI



tomcat and spring boot (2)

Estoy usando Spring Boot con Embedded Tomcat e intento usar JNDI pero obtengo el siguiente error:

javax.naming.NameNotFoundException: Nombre [jdbc / dataSource]

Algún consejo sería de gran aprecio.

Aquí está mi código:

@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)


Necesita establecer lookupOnStartup en falso en JndiObjectFactoryBean.

Alternativamente, si necesita que la búsqueda funcione durante el inicio, entonces esta respuesta puede ser de interés.

Editar: también ha establecido incorrectamente el nombre JNDI en su bean JndiObjectFactory . Necesita ser java:comp/env/jdbc/myDataSource no jdbc/dataSource .

Utiliza un nombre diferente cuando busca el recurso en comparación con cuando lo registró, ya que el registro coloca automáticamente el recurso debajo de java:comp/env/ .


Si está utilizando el arranque de resorte, no hay necesidad de toda esa clase. Ya está configurado en @EnableAutoConfiguration o @SpringBootApplication

Simplemente ponga lo siguiente en su archivo application.xml o equivalente en el archivo 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