@Value注释语法问题

时间:2014-04-04 16:33:44

标签: java spring properties annotations

在Spring MVC anotation驱动的web应用程序中,我将此作为我的容器配置

@EnableWebMvc
@Configuration
@ComponentScan("com.mobiusinversion.web")
public class Config {

    @Value("${jdbc.driverClassName}")   private String driverClassName;
    @Value("${jdbc.url}")               private String url;
    @Value("${jdbc.username}")          private String username;
    @Value("${jdbc.password}")          private String password;

在我的application.properties中,我有

 ################### JDBC Configuration ##########################
 jdbc.driverClassName=org.hsqldb.jdbcDriver
 jdbc.url=jdbc:hsqldb:file:db/myDB;shutdown=true
 jdbc.username=david
 jdbc.password=

但是当我在我的码头服务器的webapps目录中部署我的战争时,我收到了这个错误:

Caused by: 
java.lang.ClassNotFoundException: ${jdbc.driverClassName}
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:436)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:389)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)

很明显,这个属性没有得到处理。如何正确使用@Value注释来配置此属性?

1 个答案:

答案 0 :(得分:2)

您需要在上下文中提供PropertySourcesPlaceholderConfigurer bean。对于Java配置,必须通过static @Bean方法提供它,以便Spring提示它是BeanFactoryPostProcessor并且不需要(应该在之前初始化) @Configuration bean。

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

如果您未通过上述PropertySourcesPlaceholderConfigurer方法中的@Bean设置者直接提供PropertySources,则必须以其他方式提供来源。例如,使用@PropertySource

@EnableWebMvc
@Configuration
@ComponentScan("com.mobiusinversion.web")
@PropertySource("classpath:your.properties")
public class Config {