我的控制器
@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
任何帮助都会很棒......
答案 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)
看看这是否有帮助
<util:properties id="appConfigProperties" location="location to your properties file" /> <context:property-placeholder properties-ref="appConfigProperties" />
来自架构 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
然后在您想要从属性文件中获取值的代码中将其用作
@Value(&#34; $ {myPropl}&#34)
private String str;
适合我,让我知道是否卡在任何地方:)
答案 3 :(得分:-1)