2014-10-22 31 views
8

Ho una nuova applicazione Web Spring Boot che voglio connettere a un'origine dati JNDI (un database MySQL definito nel contesto.xml di Tomcat).Avvio a molla con origine dati JNDI

Tuttavia, quando provo a farlo, ottengo sempre la seguente eccezione;

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. 

Questo nonostante la mia pom.xml contenente il connettore 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> 

ho definito il mio application.properties come segue per utilizzare la proprietà jndi-nome.

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 

Tuttavia, nonostante ciò sembra che Spring crede che sia necessario utilizzare un database in memoria.

sono in grado di connettersi al database MySQL se io definisco i miei application.properties come modo

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 

Qualcuno può aiutarmi a connettersi a JNDI con la Primavera di avvio?

+1

avvio primavera 1.1 non supporta ricerche JNDI, l'imminente 1.2 fa. Se vuoi fare una ricerca in 1.1 fai da te ... Anche quando fai una ricerca jndi non dovresti avere bisogno di un driver dato che è tutto parte del server. –

+0

Grazie M. Deinum. In effetti l'aggiornamento a 1.2.0.M1 era la risposta! – johnmmcparland

+0

Vorrei passare ad M2 perché è un po 'più recente ... Non sono sicuro quando la finale sta per essere rilasciata (non sono sicuro se c'è un calendario di rilascio per quello). –

risposta

6

Come commentato da M. Deinum, la ricerca JDNI è implementata in Spring Boot 1.2, la versione corrente è 1.2.0.M2.

Se si vuole fare con la Primavera Boot 1.1, è possibile definire un fagiolo come questo:

@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(); 
} 
+1

Grazie a @dunni. Ho aggiornato a Spring Boot 1.2.0.M1 e sono riuscito a farlo tramite la proprietà spring.datasource.jndi-name. Venerato in alcun modo. – johnmmcparland

1

Per me ha funzionato la seguente configurazione, guidato dalla ricetta esposta in questa link, ma come si suol detto prima lo stesso lavoro con le versioni di avvio primavera 1.2 o più

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;  
} 

}

Problemi correlati