是否可以使用@PropertySource
注释配置必须用于加载属性文件的编码?
澄清我的问题的一个例子
@Configuration
@PropertySource("classpath:/myprop.properties")
public class MyApplicationContext {
@Autowired(required = true)
private Environment env;
@Bean
public MyBean myBean() {
return new MyBean(env.getRequiredProperty("application.name"));
}
}
myprop.properties
是UTF-8
文件,但无论如何,“application.name”都被解释为ISO-8859-1
。
解决方法是在属性文件中转义特殊字符,但是使用旧context:property-placeholder
可以设置编码,所以我认为应该可以对@PropertySource
答案 0 :(得分:11)
现在可以:
@PropertySource(value = "classpath:/myprop.properties", encoding="UTF-8")
答案 1 :(得分:6)
.properties
个文件是per definition ISO-8859-1编码。所以我担心你不能这样做。
但是,您可以使用\uXXXX
unicode escapes来表示您想要的任何unicode字符。 (略微错误的)native2ascii
tool可以帮助自动执行此操作。
答案 2 :(得分:3)
旧
执行相同的操作context:property-placeholder
所以我认为应该如此 可以对@PropertySource
@PropertySource
和context:property-placeholder
是两个完全不同的组件。 @PropertySource
注册一个.properties
文件,ApplicationContext
和Environment
加载@Configuration
类,而context:property-placeholder
注册PropertyPlaceholderConfigurer
或{ {1}} bean执行占位符解析。该bean可以访问使用它声明的PropertySourcesPlaceholderConfigurer
文件中的属性以及包含.properties
的可用属性。
对于Environment
使用的编码,您无能为力。它将使用系统默认值。
您始终可以自己声明@PropertySource
bean(使用PropertySourcesPlaceholderConfigurer
static
方法),声明一些@Bean
文件和编码。但请注意,这些属性不会通过.properties
提供。
答案 3 :(得分:3)
我的解决方案:
new MyBean(new String(env.getProperty(" application.name")。getBytes(" ISO-8859-1")," UTF-8&#34 ;));
答案 4 :(得分:0)
或者您可以使用具有setEncoding方法的PropertiesFactoryBean。这是我的一个项目中的一个例子
@Bean
public PropertiesFactoryBean cvlExternalProperties() {
PropertiesFactoryBean res = new PropertiesFactoryBean();
res.setFileEncoding("UTF-8");
res.setLocation(new ClassPathResource("conf/external-test.properties"));
return res;
}
然后您可以在项目中使用以下符号
@Value("#{cvlExternalProperties['myProperty']}")
private String p;
答案 5 :(得分:0)
温馨提醒:
在其他项目类中定义具有不同功能的@PropertySource可以给您带来意想不到的结果。
例如
在A类中:
<script src="{{ secure_url(mix('css/app.css')) }}"></script>
在B类中:
@PropertySource(value = "classpath:/myprop.properties", encoding="UTF-8")
B类的注释可能会覆盖A类的注释,在这种情况下,A类的编码将无效。