2

我的控制器有

@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

4 回答 4

2

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

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

但您只能使用database.propertiesxml 配置中的值

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

如果要在@Valuebean 字段的注释内使用属性文件中的值,则需要向 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();
    }
}
于 2016-06-02T16:35:03.337 回答
1

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

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

bean 工厂后处理器的范围是每个应用程序上下文。

更改您的 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 一起使用,因为它还从环境中选择属性。但是上面比下面干净

@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;
   }
}
于 2016-06-02T16:56:15.770 回答
0

看看这是否有帮助

  1. 你可以继续在你的 xml 配置中使用这个 util 标签

<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. 然后在您希望从属性文件中获取值的代码中,将其用作

@Value("${myPropl}")
私有字符串 str;

对我有用,让我知道是否卡在任何地方:)

于 2016-06-02T18:38:31.967 回答
-1

仔细阅读这个http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

对于开发模式,使用特定于配置文件的属性

于 2016-06-01T22:01:19.727 回答