2014-10-22 2 views
8

JNDI 데이터 소스 (Tomcat의 context.xml에 정의 된 MySQL 데이터베이스)에 연결하려는 새 Spring Boot 웹 응용 프로그램이 있습니다.JNDI 데이터 소스로 봄 부팅

그러나 이것을 시도하면 항상 다음과 같은 예외가 발생합니다.

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의 커넥터 JNDI 이름 속성을 사용하여 다음과 같이 내 application.properties을 정의

<?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> 

를 포함하는 내 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 

그러나 스프링이 메모리 내 데이터베이스를 사용해야한다고 생각하는 것 같지만. 나는 그래서 내 application.properties를 정의하는 경우 MySQL 데이터베이스에 연결할 수 있어요

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 

사람은 나를 봄 부팅과 JNDI에 연결 도와 드릴까요?

+1

봄 부팅 1.1과 같은 작업을하기 전에 말했다 다가오는 1.2 않습니다. 1.1에서 룩업을하고 싶다면 ... 직접 jndi 검색을 할 때 드라이버가 필요하지는 않습니다. 왜냐하면 모든 것이 서버의 일부이기 때문입니다. –

+0

감사합니다 M. Deinum. 실제로 1.2.0.M1로 업그레이드하는 것이 답이었습니다! – johnmmcparland

+0

조금 더 새로운 M2로 업그레이드 할 예정입니다 ... 최종본이 출시 될 때 확실하지 않습니다 (해당 릴리스 캘린더가 있는지 확실하지 않음). –

답변

6

M. Deinum이 논평 한대로 JDNI 조회는 Spring Boot 1.2에서 구현되며 현재 버전은 1.2.0.M2입니다.

당신이 봄 부팅 1.1을 함께하고 싶어,이 같은 콩 정의 할 수 있습니다 : 나를 위해

@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 none-the-less. – johnmmcparland

1

가이 link에 노출 된 조리법에 의해 인도 다음과 같은 구성을, 일을하지만, 그들이 JNDI 조회를 지원하지 않습니다 스프링 부팅 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;  
} 

}