복붙노트

[SPRING] @PropertySource 및 UTF-8 특성 파일

SPRING

@PropertySource 및 UTF-8 특성 파일

@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는 aUTF-8 파일이지만 "application.name"은 ISO-8859-1로 해석됩니다.

해결 방법은 속성 파일에서 특수 문자를 이스케이프 처리하는 것이지만 인코딩을 설정하는 것은 이전 컨텍스트에서 가능합니다 : property-placeholder 그래서 @PropertySource와 동일한 작업을 수행 할 수 있어야한다고 생각합니다.

해결법

  1. ==============================

    1.이제 가능합니다 :

    이제 가능합니다 :

    @PropertySource (값 = "classpath : /myprop.properties", 인코딩 = "UTF-8")

  2. ==============================

    2..properties 파일은 정의에 따라 ISO-8859-1로 인코딩됩니다. 그래서 네가 그렇게 할 수없는 것 같아.

    .properties 파일은 정의에 따라 ISO-8859-1로 인코딩됩니다. 그래서 네가 그렇게 할 수없는 것 같아.

    그러나 \ uXXXX 유니 코드 이스케이프를 사용하여 원하는 유니 코드 문자를 나타낼 수 있습니다. (약간 잘못 명명 된) native2ascii 도구는 자동으로 그렇게 할 수 있습니다.

  3. ==============================

    3.@PropertySource와 context : property-placeholder는 완전히 다른 두 가지 구성 요소입니다. @PropertySource는 @Configuration 클래스를로드하는 ApplicationContext 및 Environment에 .properties 파일을 등록하고 context : property-placeholder는 PlacePlaceholderConfigurer 또는 PropertySourcesPlaceholderConfigurer bean을 등록하여 자리 표시 자 확인을 수행합니다. 이 bean은 함께 선언 된 .properties 파일의 등록 정보와 포함 된 환경에서 사용 가능한 등록 정보에 대한 액세스 권한을 갖습니다.

    @PropertySource와 context : property-placeholder는 완전히 다른 두 가지 구성 요소입니다. @PropertySource는 @Configuration 클래스를로드하는 ApplicationContext 및 Environment에 .properties 파일을 등록하고 context : property-placeholder는 PlacePlaceholderConfigurer 또는 PropertySourcesPlaceholderConfigurer bean을 등록하여 자리 표시 자 확인을 수행합니다. 이 bean은 함께 선언 된 .properties 파일의 등록 정보와 포함 된 환경에서 사용 가능한 등록 정보에 대한 액세스 권한을 갖습니다.

    @PropertySource에 사용 된 인코딩에 대해 수행 할 수있는 작업은 없습니다. 시스템 기본값을 사용합니다.

    항상 PropertySourcesPlaceholderConfigurer 빈을 정적 (정적 @Bean 메소드로) 선언하고, 일부 .properties 파일과 인코딩을 선언 할 수 있습니다. 그러나 이러한 속성은 환경을 통해 사용할 수 없습니다.

  4. ==============================

    4.내 솔루션 :

    내 솔루션 :

    새로운 MyBean (새로운 String (env.getProperty ( "application.name"). getBytes ( "ISO-8859-1"), "UTF-8"));

  5. ==============================

    5.또는 setEncoding 메소드가있는 PropertiesFactoryBean을 사용할 수 있습니다. 여기 내 프로젝트 중 하나의 예제

    또는 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;
    
  6. ==============================

    6.예고편 :

    예고편 :

    다른 프로젝트 클래스의 다른 기능으로 @PropertySource를 정의하면 예상치 못한 결과가 발생할 수 있습니다.

    예를 들면

    클래스 A :

     @PropertySource(value = "classpath:/myprop.properties", encoding="UTF-8")
    

    클래스 B에있는 동안 :

    @PropertySource(value = "classpath:/myprop.properties")
    

    클래스 B의 주석은 클래스 A를 대체 할 수 있으며이 경우 클래스 A의 인코딩은 무효화됩니다.

  7. from https://stackoverflow.com/questions/25325892/propertysource-and-utf-8-properties-file by cc-by-sa and MIT license