name example annotation spring jndi spring-boot

example - Spring Boot con fuente de datos JNDI



spring datasource properties (2)

Tengo una nueva aplicación web Spring Boot que quiero conectar a una fuente de datos JNDI (una base de datos MySQL definida en el contexto de Tomcat).

Sin embargo, cuando intento esto, siempre obtengo la siguiente excepción;

org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database url for database type NONE. If you want an embedded database please put a supported on on the classpath.

Esto a pesar de mi pom.xml que contiene el conector MySQL

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.test</groupId> <artifactId>twojndi</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>Two JNDI Data Sources</name> <description>Two JNDI Data Sources Example</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.1.8.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> </exclusion> <exclusion> <artifactId>tomcat-jdbc</artifactId> <groupId>org.apache.tomcat</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <start-class>org.test.twojndi.Application</start-class> <java.version>1.7</java.version> </properties> <build> <finalName>${artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

He definido my application.properties de la siguiente manera para usar la propiedad jndi-name.

spring.datasource.jndi-name=java:comp/env/jdbc/twojndi_ds1 spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

Sin embargo, a pesar de eso, parece que Spring cree que se debe usar una base de datos en memoria.

Puedo conectarme a la base de datos MySQL si defino mi application.properties como tal

spring.datasource.url=jdbc:mysql://localhost:3306/twojndi_ds1 spring.datasource.username=twojndi spring.datasource.password=twojndi spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

¿Alguien puede ayudarme a conectarme a JNDI con Spring Boot?


Para mí funcionaba la siguiente configuración, guiada por la receta expuesta en este enlace , pero como decían antes el mismo trabajo con versiones de resorte de arranque 1.2 o más

public class DomainAndPersistenceJndi { private JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); hibernateJpaVendorAdapter.setShowSql(true); hibernateJpaVendorAdapter.setDatabase(Database.INFORMIX); hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate..."); return hibernateJpaVendorAdapter; } @Bean(name = "dataSourcejndi") public DataSource dataSourcejndi() throws NamingException { JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); bean.setJndiName("java:jboss/datasources/..." ); bean.setProxyInterface(DataSource.class); bean.setLookupOnStartup(false); bean.afterPropertiesSet(); return (DataSource) bean.getObject(); } @Bean(name = "entityManagerFactoryJndi") public LocalContainerEntityManagerFactoryBean entityManagerFactoryJndi(@Qualifier("dataSourcejndi") DataSource dataSource) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource( dataSource); em.setPackagesToScan(EntidadBase.class.getPackage().getName()); em.setJpaVendorAdapter(jpaVendorAdapter()); em.setPersistenceUnitName("BaseDSjdni"); em.afterPropertiesSet(); return em; }

}


Como comentó M. Deinum, la búsqueda JDNI se implementa en Spring Boot 1.2, la versión actual es 1.2.0.M2.

Si desea hacerlo con Spring Boot 1.1, puede definir un bean como este:

@Bean public DataSource dataSource() { JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean(); jndiObjectFactoryBean.setJndiName("jdbc/jndidatasource"); try { jndiObjectFactoryBean.afterPropertiesSet(); } catch (NamingException e) { LOGGER.error("Error while retrieving datasource with JNDI name jdbc/jndidatasource", e); } return (DataSource) jndiObjectFactoryBean.getObject(); }