我的弹簧控制器中的@Value不起作用

时间:2016-06-01 21:19:49

标签: spring property-placeholder

我的控制器

@Value("${myProp}")
private String myProp;

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

@RequestMapping(value = "myProp", method = RequestMethod.GET)
public @ResponseBody String getMyProp(){
    return "The prop is:" + myProp;
}

我的applicationcontext.xml

<bean id="appConfigProperties" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="location" value="classpath:MyApps-local.properties" />
</bean>

我得到以下异常:

  

引起:java.lang.IllegalArgumentException:无法解决   占位符'myProp'在字符串值“$ {myProp}”

注意:我的属性文件MyApps-local.properties位于classpath并包含 myProp=delightful

任何帮助都会很棒......

4 个答案:

答案 0 :(得分:2)

在基于XML的配置中,您需要使用PropertyPlaceholderConfigurer bean

<beans xmlns="http://www.springframework.org/schema/beans" . . . >
  . . .
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:database.properties" />
    </bean>
  . . .
</beans>

但您只能在xml配置中使用database.properties中的值

<beans xmlns="http://www.springframework.org/schema/beans" . . >
  . . .
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
  . . .
</beans>

如果要在bean的字段@Value注释中使用属性文件中的值,则需要向bean类添加@Confuguration@PropertySource注释。喜欢这个

@Configuration
@PropertySource("classpath:database.properties")
public class AppConfig {

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

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

答案 1 :(得分:1)

在您的配置中,您有两个PropertySourcesPlaceholderConfigurer。使用Java @Configuration在DispatcherServlet中定义的第一个使用标准环境来查找属性。这意味着来自系统环境和环境变量的属性以及已定义的@PropertySource。

这不知道applicationContext.xml中指定的MyApps-local.properties文件。 xml文件中的第二个PropertySourcesPlaceholderConfigurer知道MyApps-local.properties文件,但它只在根应用程序上下文中发布进程占位符

bean factory post处理器的范围是每个应用程序上下文。

更改您的Web应用程序上下文以指定属性源。这会将文件中的属性添加到您的环境中

@Configuration
@PropertySource("classpath:MyApps-local.properties")
public class WebConfig{
   @Autowired
   private Environment env;

   @RequestMapping(value = "myProp", method = RequestMethod.GET)
   public @ResponseBody String getMyProp(){
       return "The prop is:" + env.getProperty("myProp");
   }
 }

在这种情况下,您不需要PropertySourcesPlacheholder,因为您可以从环境中查询其属性。然后按原样保留applicationContext.xml

它也可以与PropertySourcesPlaceholder @Bean一起使用,因为它也从环境中选择属性。然而,abover比下面的清洁

@Configuration
@PropertySource("classpath:MyApps-local.properties")
public class WebConfig{

   @Value("${myProp}")
   private String myProp;

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

   @RequestMapping(value = "myProp", method = RequestMethod.GET)
   public @ResponseBody String getMyProp(){
     return "The prop is:" + myProp;
   }
}

答案 2 :(得分:0)

看看这是否有帮助

  1. 您可以继续在xml配置中使用此util标记
  2.   

    <util:properties id="appConfigProperties" location="location to your properties file" /> <context:property-placeholder properties-ref="appConfigProperties" />

    1. 来自架构 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd

    2. 然后在您想要从属性文件中获取值的代码中将其用作

    3. @Value(&#34; $ {myPropl}&#34)
      private String str;

      适合我,让我知道是否卡在任何地方:)

答案 3 :(得分:-1)