2014-06-12 2 views
2

환경으로부터 데이터베이스 특정 속성을 구성하는 클래스가 있습니다. @Value 주석 값스프링 @Value 주석은 값을 역 참조하지 않습니까?

내가 여기서 무엇을 놓치고 있는지

를 역 참조하지 않는 것처럼 내가

[INFO] [talledLocalContainer] Jun 12, 2014 8:47:45 AM org.apache.catalina.core.StandardContext listenerStart 
[INFO] [talledLocalContainer] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549) ~[spring-beans-4.0.3.RELEASE.jar:4.0.3.RELEASE] 
[INFO] [talledLocalContainer] ... 25 common frames omitted 
[INFO] [talledLocalContainer] Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${database_driverClassName:com.mysql.jdbc.Driver}' 
[INFO] [talledLocalContainer] SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
[INFO] [talledLocalContainer] at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1429) ~[commons-dbcp-1.4.jar:1.4] 
[INFO] [talledLocalContainer] at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) ~[commons-dbcp-1.4.jar:1.4] 
[INFO] [talledLocalContainer] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is liquibase.exception.DatabaseException: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${database_driverClassName:com.mysql.jdbc.Driver}' 
[INFO] [talledLocalContainer] at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) ~[commons-dbcp-1.4.jar:1.4] 
[INFO] [talledLocalContainer] at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:296) ~[liquibase-core-3.1.1.jar:na] 
[INFO] [talledLocalContainer] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553) 
[INFO] [talledLocalContainer] ... 27 common frames omitted 
[INFO] [talledLocalContainer] Caused by: java.lang.ClassNotFoundException: ${database_driverClassName:com.mysql.jdbc.Driver} 

같은 실패를 참조

@Configuration 
@Profile("default") 
public class MySqlDatabaseConfig extends JpaCommonConfig { 
    @Value("${database_url:jdbc:mysql://localhost:3306/pryme?createDatabaseIfNotExist=true }") 
    private String databaseUrl; 

    @Value("${database_user:root}") 
    private String databaseUser; 

    @Value("${database_password:\"\"}") 
    private String databasePassword; 

    @Value("${database_driverClassName:com.mysql.jdbc.Driver}") 
    private String databaseDriverClass; 


    private static final Logger LOGGER = LoggerFactory.getLogger(MySqlDatabaseConfig.class); 

    @Override 
    public DataSource dataSource() { 
     final BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(getDriverClassName()); 
     dataSource.setUrl(getUrl()); 
     dataSource.setUsername(getUser()); 
     if (!getPassword().trim().isEmpty()) { 
      dataSource.setPassword(getPassword()); 
     } 

     LOGGER.debug("DriverClass={}, URL={}, User={}", getDriverClassName(), getUrl(), getUser()); 
     return dataSource; 
    } 

    @Override 
    public String getUrl() { 
     return databaseUrl; 
    } 

    @Override 
    public String getUser() { 
     return databaseUser; 
    } 

    @Override 
    public String getPassword() { 
     return databasePassword; 
    } 

    @Override 
    public String getDriverClassName() { 
     return databaseDriverClass; 
    } 

    @Override 
    protected Class<? extends Dialect> getDatabaseDialect() { 
     return MySQL5InnoDBDialect.class; 
    } 
} 

내 테스트를 실행

처럼 보이는 것 같다?

+0

을 어떻게 Spring 컨텍스트에 그'database_driverClassName' 속성을 얻고있다? – chrylis

답변

1

당신은 같은 application.properties 파일의 값을 넣어한다 , .properties 파일에서 값을 가져 오는 응용 프로그램 구성을 만들 수 있다면 (이름은 i가 아닙니다. 위의 .properties 파일과 일치하는 한 중요합니다). 이 시점에서

@Configuration 
@PropertySource(value = "classpath:application.properties") 
public class AppConfig{ 

@Bean 
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

, 당신은 .properties 파일에서 키를 지정하면 실제 값을 해결 할 @Value 주석 :

@Value("${database_url}") 
String databaseUrl; 

@Value("${database_user}") 
String databaseUser; 
1

PropertySource 및 PropertySourcesPlaceholderConfigurer가 필요합니다.

예 :

@Configuration 
@PropertySource(value = { "classpath:application.properties" }) 
... 


@Bean 
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
} 
0

또한이 같은 @Resource 주석을 사용할 수 있습니다 : 이제

database_url=jdbc:mysql://localhost:3306/pryme?createDatabaseIfNotExist=true 
database_user=root 
# more values... 

:

@Configuration 
@PropertySource("classpath:application.properties") 
... 

@Resource 
private Environment env; 


dataSource.setUrl(env.getRequiredProperty("dataSource.url")); 
관련 문제