programing

Spring Boot: @Value는 항상 null을 반환합니다.

muds 2023. 6. 30. 22:39
반응형

Spring Boot: @Value는 항상 null을 반환합니다.

다음 값을 사용합니다.application.properties다른 클래스의 메서드에 전달하기 위한 파일입니다.문제는 값이 항상 반환된다는 것입니다.NULL무엇이 문제일까요?잘 부탁드립니다.

application.properties

filesystem.directory=temp

FileSystem.java

@Value("${filesystem.directory}")
private static String directory;

정적 변수에는 @Value를 사용할 수 없습니다.정적으로 표시하거나 정적 변수에 값을 주입하는 방법을 여기서 확인해야 합니다.

https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/

EDIT: 앞으로 링크가 끊어질 경우를 대비해서입니다.정적 변수에 대해 정적이 아닌 설정자를 만들어 이 작업을 수행할 수 있습니다.

@Component
public class MyComponent {

    private static String directory;

    @Value("${filesystem.directory}")
    public void setDirectory(String value) {
        this.directory = value;
    }
}

클래스는 Spring bean이어야 하지만 그렇지 않으면 인스턴스화되지 않고 Spring에 의해 세터에 액세스할 수 없습니다.

앞의 모든 제안 이후에도 여전히 문제가 발생하는 경우, 빈이 구성되기 전에 해당 변수에 액세스하지 않도록 하십시오.

즉, 다음과 같습니다.

이렇게 하는 대신:

@Component
public MyBean {
   @Value("${properties.my-var}")
   private String myVar;

   private String anotherVar = foo(myVar); // <-- myVar here is still null!!!
}

수행:

@Component
public MyBean {
   @Value("${properties.my-var}")
   private String myVar;

   private String anotherVar;

   @PostConstruct  
   public void postConstruct(){

      anotherVar = foo(myVar); // <-- using myVar after the bean construction
   }
}

이것이 누군가가 시간 낭비를 피하는 데 도움이 되기를 바랍니다.

@Plog의 답변 외에 당신이 교차 확인해야 할 몇 가지 사항이 있습니다.

static변수에 값을 주입할 수 없습니다.@Plog의 답변을 확인합니다.

  • 클래스에 주석이 달렸는지 확인합니다.@Component또는@Service
  • 구성 요소 스캔은 동봉된 패키지를 스캔하여 콩을 등록해야 합니다.xml이 활성화된 경우 XML 구성을 확인합니다.
  • 속성 파일의 경로가 올바른지 또는 클래스 경로에 있는지 확인합니다.

다른 답들은 아마도 OP에 맞는 답일 것입니다.

그런데 같은 증상을 겪었습니다.@Value-선택 필드 있음null하지만 다른 근본적인 문제가 있습니다.

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

올바른 항목을 가져오는 중인지 확인합니다.@Value주석 클래스!특히 요즘 IDE의 편리함으로 인해 이것은 매우 쉽게 실수할 수 있습니다(InteliJ를 사용하고 있으며, 자동으로 가져오는 내용을 읽지 않고 너무 빨리 자동으로 가져오면 저처럼 몇 시간을 낭비할 수 있습니다).

물론 가져올 올바른 클래스는 다음과 같습니다.

import org.springframework.beans.factory.annotation.Value;

스프링은 @Value 주석을 찾을 때 종속성 주입을 사용하여 특정 값을 채웁니다.그러나 인스턴스 변수에 값을 전달하는 대신 암묵적인 세터에 전달됩니다.그런 다음 이 설정기는 NAME_STATIC 값의 채우기를 처리합니다.

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {

    @Value("${name}")//not necessary
    private String name;//not necessary

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}

당신은 이것을 활용할 수 있습니다.값을 평가하는 참조(개인 String myVar)

this.myVar

언급URL : https://stackoverflow.com/questions/46032748/spring-boot-value-returns-always-null

반응형