복붙노트

[SPRING] Spring @Value 주석은 항상 null로 평가됩니까?

SPRING

Spring @Value 주석은 항상 null로 평가됩니까?

그래서, 다음과 같은 엔트리를 가진 간단한 프로퍼티 파일을 가지고 있습니다 :

my.value=123
another.value=hello world

이 등록 정보 파일은 위의 등록 정보 파일을 참조하는 PropertyPlaceHolderConfigurer를 사용하여로드됩니다.

나는 다음과 같은 클래스를 가지고 있는데,이를 위해 다음과 같은 속성을로드하려고한다.

public class Config
{
    @Value("${my.value}")
    private String mValue;

    @Value("${another.value}")
    private String mAnotherValue;

    // More below...
}

문제는, mValue와 mAnotherValue는 항상 null입니다.하지만, 내 컨트롤러에서는 값이 잘로드되고 있습니다. 뭐라 구요?

해결법

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

    1.Config의 인스턴스가 new를 통해 수동으로 인스턴스화되는 경우 Spring이 관련되지 않으므로 주석이 무시됩니다.

    Config의 인스턴스가 new를 통해 수동으로 인스턴스화되는 경우 Spring이 관련되지 않으므로 주석이 무시됩니다.

    Spring이 (아마도 프로토 타입 범위의 bean을 사용하여) Bean을 인스턴스화하도록 코드를 변경할 수 없다면, 다른 옵션은 Spring의 로딩 타임 클래스 로더 기능을 사용하는 것이다 (문서 참조). 이것은 평범한 것처럼 객체를 인스턴스화 할 수있는 저수준 AOP이지만 Spring은 응용 프로그램 컨텍스트를 통해 객체를 전달하여 유선 연결, 구성, 초기화 등을 수행합니다.

    하지만 모든 플랫폼에서 작동하지는 않습니다. 따라서 위의 설명서 링크를 읽어 보면 도움이되는지 확인할 수 있습니다.

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

    2.나는 비슷한 문제를 가지고 있었지만 봄을 초보자로 생각했다. @Service에 속성을로드하려고 시도하면서 @Value를 사용하여 속성 값을 검색하려고 시도했습니다.

    나는 비슷한 문제를 가지고 있었지만 봄을 초보자로 생각했다. @Service에 속성을로드하려고 시도하면서 @Value를 사용하여 속성 값을 검색하려고 시도했습니다.

    @Autowired
    public @Value("#{myProperties['myValue']}") String myValue;
    

    나는 하루 종일 다양한 주석 조합을 시도하지만, 항상 null을 반환했습니다. 결과적으로 결국 대답은 분명합니다.

    1) Spring이 패키지 계층 구조를 포함하여 주석을 클래스에서 검색하는지 확인하십시오 servlet.xml에서 삽입 한 기본 값 아래의 모든 것을 검사합니다.

    2) 봄을 보도록 지시 한 수업을 '새롭게'하지 않았는지 확인하십시오. 대신 @Controller 클래스에서 @Autowire를 사용합니다.

    Spring의 모든 것이 Singleton이고, 일어나는 일은 Spring이 값을 Singleton에로드 한 다음 새로로드 된 값을 포함하지 않은 클래스의 또 다른 인스턴스를 new'ed했기 때문에 항상 null이었습니다.

    대신에 @Controller use ...

    @Autowired
    private MyService service; 
    

    디버깅 중 ... 내가 찾은 한 가지는 다음과 같이 내 봉사를 확장하는 것이 었습니다 ...

    @Service
    public class MyService implements InitializingBean 
    

    그럼 디버그 문을 넣어 ...

    @Override
    public void afterPropertiesSet() throws Exception {
    // TODO Auto-generated method stub
    LOGGER.debug("property myValue:" + myValue);        
    }
    

    여기서 초기화시 값을 설정할 수 있었고 나중에 메서드에서 인쇄했을 때 null 이었기 때문에 동일한 인스턴스가 아니라는 것을 알 수있었습니다.

    이 오류에 대한 또 다른 단서는 Tomcat이 HTTPheader를 구문 분석 할 수 없음을 Socket에서 읽으려고 시도하는 시간 초과에 대해 불만을 토로했다는 것입니다. 이는 Spring이 서비스의 인스턴스를 생성 했으므로 나도 그렇기 때문에 내 작업이 실제 작업을 수행했기 때문입니다. Spring은 그 인스턴스를 타임 아웃하고있었습니다.

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

    3.@Controller와 함께 작업하면서 Config를 직접 인스턴스화하는 것 같습니다. Spring이 그것을 인스턴스화하게하십시오.

    @Controller와 함께 작업하면서 Config를 직접 인스턴스화하는 것 같습니다. Spring이 그것을 인스턴스화하게하십시오.

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

    4.를 응용 프로그램 컨텍스트 파일에 추가하십시오.

    를 응용 프로그램 컨텍스트 파일에 추가하십시오.

    그런 다음 @Configurable 주석을 Config 클래스에 추가하십시오.

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

    5.또한 속성을 비공개로 만들 수도 있고 클래스가 @Service 또는 @Component 주석을 사용하는 Spring 빈인지 확인하여 항상 인스턴스화되고 마지막으로 @Value로 주석 된 setter 메서드를 추가 할 수도 있습니다. 이렇게하면 속성에 application.properties 또는 cloud yml 구성 파일에 지정된 값이 할당됩니다.

    또한 속성을 비공개로 만들 수도 있고 클래스가 @Service 또는 @Component 주석을 사용하는 Spring 빈인지 확인하여 항상 인스턴스화되고 마지막으로 @Value로 주석 된 setter 메서드를 추가 할 수도 있습니다. 이렇게하면 속성에 application.properties 또는 cloud yml 구성 파일에 지정된 값이 할당됩니다.

    @Service
    public class Config {
        private static String mValue;
    
        private static String mAnotherValue;
    
        @Value("${my.value}")    
        public void setmValue(String mValue) {
        this.mValue = mValue;}
    
        @Value("${another.value}")
        public void setmAnotherValue(String mAnotherValue) {
        this.mAnotherValue = mAnotherValue;}
    
        //rest of your code...
    }
    
  6. ==============================

    6.내 대답은 여기를 참조하십시오.

    내 대답은 여기를 참조하십시오.

    나는 동일한 증상 (@ Value-annotated 필드가 null 인)을 만났지 만 다른 근본적인 문제가있다.

    import com.google.api.client.util.Value;

    올바른 @Value 주석 클래스를 가져오고 있는지 확인하십시오! 특히 IDE의 편리함과 함께, 이것은 매우 쉬운 실수입니다 (IntelliJ를 사용하고 있으며, 자동 가져 오기를 읽지 않고 너무 빨리 자동 가져 오기를하면, 내가했던 것처럼 몇 시간을 낭비 할 수 있습니다).

  7. from https://stackoverflow.com/questions/4130486/spring-value-annotation-always-evaluating-as-null by cc-by-sa and MIT license