@PropertySource和UTF-8属性文件

时间:2014-08-15 11:49:32

标签: spring utf-8 character-encoding

是否可以使用@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.propertiesUTF-8文件,但无论如何,“application.name”都被解释为ISO-8859-1

解决方法是在属性文件中转义特殊字符,但是使用旧context:property-placeholder可以设置编码,所以我认为应该可以对@PropertySource

进行同样的操作

6 个答案:

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

执行相同的操作

@PropertySourcecontext:property-placeholder是两个完全不同的组件。 @PropertySource注册一个.properties文件,ApplicationContextEnvironment加载@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类的编码将无效。