2014-10-22 295 views
8

我有一个新的Spring Boot Web应用程序,我想要连接到JNDI数据源(在Tomcat的context.xml中定义的MySQL数据库)。使用JNDI数据源进行Spring Boot

但是,当我尝试这个,我总是得到以下例外;

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. 

尽管这是一个包含了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> 

我定义我的application.properties如下使用JNDI名称属性我的pom.xml。

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 

尽管如此,Spring认为应该使用内存数据库。

我能够连接到MySQL数据库,如果我定义我application.properties为使

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 

谁能帮助我连接与Spring引导到JNDI?

+1

春天开机1.1不支持JNDI查找同样的工作之前说,即将到来的1.2一样。如果你想在1.1中进行查找,请自己做...另外,在进行jndi查找时,不应该需要驱动程序,因为这是所有服务器的一部分。 – 2014-10-22 10:36:52

+0

谢谢M. Deinum。事实上升级到1.2.0.M1就是答案! – johnmmcparland 2014-10-22 14:06:12

+0

我会升级到M2,因为这是一个更新的...不知道什么时候最终即将被释放(不知道是否有一个发布日历)。 – 2014-10-22 14:10:28

回答

6

正如M. Deinum所说,JDNI查找是在Spring Boot 1.2中实现的,当前版本是1.2.0.M2。

如果你想使用Spring启动1.1做到这一点,你可以这样定义一个bean:

@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

谢谢@dunni。我升级到Spring Boot 1.2.0.M1,并且可以通过spring.datasource.jndi-name属性来完成。 Upvoted无所谓。 – johnmmcparland 2014-10-22 14:07:33

1

对我来说,它的工作如下配置,在此link暴露配方指导,但他们与春天开机1.2版本或以上

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

}

相关问题