복붙노트

[SPRING] @PropertySource 주석을 사용할 때 @Value가 해결되지 않습니다. PropertySourcesPlaceholderConfigurer를 구성하는 방법은 무엇입니까?

SPRING

@PropertySource 주석을 사용할 때 @Value가 해결되지 않습니다. PropertySourcesPlaceholderConfigurer를 구성하는 방법은 무엇입니까?

다음과 같은 구성 클래스가 있습니다.

@Configuration
@PropertySource(name = "props", value = "classpath:/app-config.properties")
@ComponentScan("service")
public class AppConfig {

나는 재산으로 봉사한다.

@Component 
public class SomeService {
    @Value("#{props['some.property']}") private String someProperty;

AppConfig 구성 클래스를 테스트 할 때 오류가 발생합니다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'someService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String service.SomeService.someProperty; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'props' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' 

이 문제는 SPR-8539에 문서화되어 있습니다.

하지만 어쨌든 PropertySourcesPlaceholderConfigurer를 구성하여 작동하게하는 방법을 알 수는 없습니다.

이 방법은 xml 구성에서 잘 작동합니다.

<util:properties id="props" location="classpath:/app-config.properties" />

하지만 구성을 위해 자바를 사용하고 싶습니다.

해결법

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

    1.@PropertySource를 사용하는 경우 속성은 다음을 사용하여 검색해야합니다.

    @PropertySource를 사용하는 경우 속성은 다음을 사용하여 검색해야합니다.

    @Autowired
    Environment env;
    // ...
    String subject = env.getProperty("mail.subject");
    

    @Value ( "$ {mail.subject}")를 사용하여 검색하려면 prop 자리 표시자를 xml로 등록해야합니다.

    이유: https://jira.springsource.org/browse/SPR-8539

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

    2.@cwash가 말했듯이;

    @cwash가 말했듯이;

    @Configuration
    @PropertySource("classpath:/test-config.properties")
    public class TestConfig {
    
         @Value("${name}")
         public String name;
    
    
         //You need this
         @Bean
         public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
            return new PropertySourcesPlaceholderConfigurer();
         }
    
    }
    
  3. ==============================

    3.@value가 @value가 PropertyPlaceholderConfigurer 대신 PropertySourcesPlaceholderConfigurer를 필요로한다는 이유를 발견했습니다. 나는 같은 변화를했고 그것은 나를 위해 일했다. 나는 봄 4.0.3 릴리스를 사용하고있다. 구성 파일에 아래 코드를 사용하여 구성했습니다.

    @value가 @value가 PropertyPlaceholderConfigurer 대신 PropertySourcesPlaceholderConfigurer를 필요로한다는 이유를 발견했습니다. 나는 같은 변화를했고 그것은 나를 위해 일했다. 나는 봄 4.0.3 릴리스를 사용하고있다. 구성 파일에 아래 코드를 사용하여 구성했습니다.

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
       return new PropertySourcesPlaceholderConfigurer();
    }
    
  4. ==============================

    4.@PropertySource를 Spring으로 등록하기 위해 @Configuration 클래스에서 PropertySourcesPlaceholderConfigurer를 반환하고 @Bean을 주석 처리하며 정적 인 메소드가 필요하지 않습니까?

    @PropertySource를 Spring으로 등록하기 위해 @Configuration 클래스에서 PropertySourcesPlaceholderConfigurer를 반환하고 @Bean을 주석 처리하며 정적 인 메소드가 필요하지 않습니까?

    http://www.baeldung.com/2012/02/06/properties-with-spring/#java

    https://jira.springsource.org/browse/SPR-8539

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

    5.나는 똑같은 문제가 있었다. @PropertySource가 @Value로 잘 재생되지 않습니다. 빠른 해결책은 평소와 같이 @ImportResource를 사용하여 Spring Java Configuration에서 참조 할 XML 설정을 갖는 것입니다. XML 설정 파일에는 (물론 필요한 네임 스페이스 행사). 다른 변경을하지 않으면 @Value가 @Configuration pojo에 속성을 삽입합니다.

    나는 똑같은 문제가 있었다. @PropertySource가 @Value로 잘 재생되지 않습니다. 빠른 해결책은 평소와 같이 @ImportResource를 사용하여 Spring Java Configuration에서 참조 할 XML 설정을 갖는 것입니다. XML 설정 파일에는 (물론 필요한 네임 스페이스 행사). 다른 변경을하지 않으면 @Value가 @Configuration pojo에 속성을 삽입합니다.

  6. ==============================

    6.이 방법으로 자바에서 구성 할 수도 있습니다.

    이 방법으로 자바에서 구성 할 수도 있습니다.

    @Bean
    public static PropertySourcesPlaceholderConfigurer properties() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        configurer.setIgnoreUnresolvablePlaceholders(true);
        configurer.setIgnoreResourceNotFound(true);
        return configurer;
    }
    
  7. ==============================

    7.그건 힘들어 보이네. 그냥 할 수 없어.

    그건 힘들어 보이네. 그냥 할 수 없어.

     <context:property-placeholder location="classpath:some.properties" ignore-unresolvable="true"/>
    

    다음 코드 참조 :

    @Value("${myProperty}")
    private String myString;
    
    @Value("${myProperty.two}")
    private String myStringTwo;
    

    some.properties는 다음과 같이 보입니다.

    myProperty = whatever
    myProperty.two = something else\
    that consists of multiline string
    

    Java 기반 구성의 경우이 작업을 수행 할 수 있습니다.

    @Configuration
    @PropertySource(value="classpath:some.properties")
    public class SomeService {
    

    그리고 나서 이전처럼 @value를 사용하여 주입하십시오.

  8. ==============================

    8.문제는 : 내가 얻은 한,

    문제는 : 내가 얻은 한,

    <bean id="id" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
      <property name="location" value="loc"/>
    </bean>
    

    (util : properties 문서 참조). 따라서 util : properties를 사용하면 독립형 bean이 작성됩니다.

    @PropertySource, 다른 한편으로는 설명서에

    (@PropertySource doc을 보라). 따라서 빈을 생성하지 않습니다.

    그런 다음 "# {a [ 'something']}"은 SpEL 표현식입니다 (SpEL 참조). 즉, "빈에서 'a'를 얻습니다. util : properties가 사용되면 bean이 존재하고 표현식은 의미가 있지만 @PropertySource가 사용될 때 실제 bean이 없으며 표현식은 의미가 없습니다.

    XML을 사용하거나 (필자가 생각하기에 가장 좋은 방법 인) XML을 사용하거나 자신이 PropertiesFactoryBean을 발행하여 일반 @Bean으로 선언함으로써이를 해결할 수 있습니다.

  9. ==============================

    9.또 다른 일이 일어날 수 있습니다 : @Value 주석이 달린 값이 정적이 아닌지 확인하십시오.

    또 다른 일이 일어날 수 있습니다 : @Value 주석이 달린 값이 정적이 아닌지 확인하십시오.

  10. from https://stackoverflow.com/questions/13728000/value-not-resolved-when-using-propertysource-annotation-how-to-configure-prop by cc-by-sa and MIT license