2014-10-22 17 views
8

Mam nową aplikację internetową Spring Boot, którą chcę połączyć ze źródłem danych JNDI (baza danych MySQL zdefiniowana w pliku kontekstowym Tomcat.xml).Spring Boot ze źródłem danych JNDI

Jednak kiedy próbuję tego, zawsze otrzymuję następujący wyjątek;

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. 

Dzieje się tak pomimo mojego pom.xml zawierającej złącze 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> 

Mam zdefiniowane moje application.properties następująco użyć właściwości 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 

Mimo to wydaje się, że Spring uważa, że ​​należy użyć bazy danych w pamięci.

jestem w stanie połączyć się z bazą danych MySQL, jeśli mogę zdefiniować moich application.properties jak tak

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 

Może ktoś mi pomóc połączyć się z JNDI wiosennego rozruchu?

+1

wiosennego rozruchu 1.1 nie obsługuje JNDI wyszukiwań, nadchodząca 1,2 robi. Jeśli chcesz wykonać odnośnik w wersji 1.1, zrób to sam ... Również podczas wykonywania wyszukiwania jndi nie potrzebujesz sterownika, ponieważ jest on częścią serwera. –

+0

Dzięki M. Deinum. W rzeczywistości uaktualnienie do wersji 1.2.0.M1 było odpowiedzią! – johnmmcparland

+0

Chciałbym uaktualnić do M2, ponieważ jest nieco nowszy ... Nie jestem pewien, kiedy finał ma zostać wydany (nie jestem pewien, czy istnieje kalendarz wydań dla tego). –

Odpowiedz

6

W komentarzu M. Deinuma, wyszukiwanie JDNI jest realizowane w Spring Boot 1.2, aktualna wersja to 1.2.0.M2.

Jeśli chcesz to zrobić z wiosennym Boot 1.1, można zdefiniować fasoli takiego:

@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

Dzięki @dunni. Zaktualizowałem program do wersji Spring Boot 1.2.0.M1 i mogłem to zrobić za pomocą właściwości spring.datasource.jndi-name. Wznowiono brak. – johnmmcparland

1

Dla mnie to zadziałało następującą konfigurację, kierując receptury odsłoniętej w tym link, ale jak oni powiedział przed samą pracę z wersji wiosennej buta 1.2 lub więcej

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

}