如何仅使用注释在Controller中读取属性文件?
属性文件包含(env.properties):
document.portal.path=http://flana.gost.com/service
Spring Controller:
@Controller
@RequestMapping("/kap/*")
@SessionAttributes({"user", "KapForm", "activity"})
public class KapController {
@Value("${document.portal.path}")
private String URL;
}
没有其他事情可做。在XML中,我们使用占位符,我没有得到如何介绍它。所以我得到例外。
Injection of autowired dependencies failed;
答案 0 :(得分:1)
你可以通过两种方式实现它
选项1
在config类中放置@PropertySource
并为PropertySourcesPlaceholderConfigurer
定义一个bean,如下所示 -
@Configuration
@PropertySource("classpath:someFile.properties")
public class SampleConfig {
// other configs...
@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
选项2
在config类中直接指定PropertyPlaceholderConfigurer
的bean并提供属性文件的名称为ClassPathResource
@Configuration
public class SampleConfig {
// other configs...
@Bean
public static PropertyPlaceholderConfigurer placeHolderConfigurer(){
PropertyPlaceholderConfigurer placeHolderConfigurer = new PropertyPlaceholderConfigurer();
ClassPathResource[] cpResources = new ClassPathResource[]
{ new ClassPathResource( "someFile.properties" ) };
placeHolderConfigurer.setLocations(cpResources);
placeHolderConfigurer.setIgnoreUnresolvablePlaceholders(true);
return placeHolderConfigurer;
}
}
请注意,占位符的bean定义必须为static
java docs(以下摘录)
必须特别考虑返回Spring
@Bean
(BFPP)类型的BeanFactoryPostProcessor
方法。由于BFPP对象必须在容器生命周期的早期实例化,因此它们可能会干扰@Autowired
类中@Value
,@PostConstruct
和@Configuration
等注释的处理。要避免这些生命周期问题,请将BFPP返回@Bean
方法标记为静态。
答案 1 :(得分:0)
另一种出路是
import org.springframework.context.MessageSource;
@Autowired
private MessageSource messageSource;
cutiePie = messageSource.getMessage("cutie.pie.property", new Object[] {},"cutie.pie.property", LocaleContextHolder.getLocale());