programing

스프링 부트 @Value 속성

madecode 2023. 3. 9. 22:39
반응형

스프링 부트 @Value 속성

Spring Boot 어플리케이션이 있으며 클래스 중 하나에서 application.properties 파일의 속성을 참조하려고 합니다.@Value그러나 속성이 해결되지 않습니다.비슷한 게시물을 보고 제안을 따르려고 노력했지만 도움이 되지 않았습니다.클래스는 다음과 같습니다.

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}

property file.directory가 있습니다.application.properties다른 분야도 있어요.

나도 너처럼 같은 문제가 있었어.여기 오류 코드가 있습니다.

@Component
public class GetExprsAndEnvId {
    @Value("hello")
    private String Mysecret;


    public GetExprsAndEnvId() {
        System.out.println("construct");
    }


    public void print(){
        System.out.println(this.Mysecret);
    }


    public String getMysecret() {
        return Mysecret;
    }

    public void setMysecret(String mysecret) {
        Mysecret = mysecret;
    }
}

이것은 이와 같은 문제는 아니지만, 다음과 같이 사용해야 합니다.

@Autowired
private GetExprsAndEnvId getExprsAndEnvId;

이렇게는 안 돼:

getExprsAndEnvId = new GetExprsAndEnvId();

여기서 @Value로 주석이 붙은 필드는 null입니다.이는 Spring이 신규로 작성된 GetExprsAndEnvId 복사에 대해 알지 못하기 때문입니다.

application.properties 파일이 src/main/resources/application.properties 아래에 있는지 확인합니다.가는 길 중 하나지다음으로 다음과 같이 @PostConstruct를 추가합니다.

샘플 Application.properties

file.directory = somePlaceOverHere

Java 클래스의 샘플

@ComponentScan
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  @PostConstruct
  public void print() {
    System.out.println(fileDirectory);
  }
}

위의 코드를 입력하면 "SomePlaceOverhere"가 출력됩니다.

스프링 부트 버전 1.4.0을 사용했는데 이 버전부터는 다음 내용만 쓸 수 있습니다.

@Component
public class MongoConnection {

@Value("${spring.data.mongodb.host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDB;
}

그럼 원하는 시간에 수업을 주입하세요.

편집:

POJO에 속성값을 삽입할 수 있기 때문에 앞으로는 @ConfigurationProperties를 사용합니다.속성 위에 계층 정렬을 유지합니다.또한 POJO 속성 위에 검증을 둘 수 있습니다.링크를 참조해 주세요.

application.properties에서 값을 읽으려면 메인 클래스에 주석을 달기만 하면 됩니다.@SpringBootApplication@Component 또는 그 종류로 읽고 있는 클래스도 있습니다.아래는 제가 읽은 샘플입니다.application.properties웹 서비스가 실행되면 정상적으로 작동합니다.동일한 코드를 전개하여 http://localhost:8080/hello에서 액세스를 시도하면 키 메시지에 대해 application.properties에 저장된 값을 얻을 수 있습니다.

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @Value("${message}")
    private String message;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @RequestMapping("/hello")
    String home() {
        return message;
    }

}

나에게 알려주려고 해.

패키지 선언을 OP에 포함시키지 않았습니다만, 어느 쪽도 OP에 포함되지 않았을 가능성이 있습니다.@SpringBootApplication도 아니다@ComponentScan를 스캔하고 있습니다.@Component.

@ComponentScan자바독 상태:

어느 하나basePackageClasses또는basePackages(또는 그 별칭)value검색할 특정 패키지를 정의하도록 지정할 수 있습니다.특정 패키지가 정의되지 않은 경우 이 주석을 선언하는 클래스의 패키지에서 검색이 수행됩니다.

이전에 IER은 이것에 많은 시간을 허비했고, 내 애플리케이션 클래스를 내 앱의 패키지 트리에서 가장 높은 패키지로 옮기는 것이 가장 쉬웠다는 것을 알게 되었습니다.

최근에 gotcha와 마주친 것은 값 삽입이 완료되기 전에 속성을 읽고 있었다는 것입니다.이 도움이 .@PostConstruct삽입된 값을 읽을 수 있는 가장 빠른 시간인 것 같습니다.물론 스프링이 이 값을 호출하도록 해야 합니다.

비슷한 문제가 있었는데 위의 예시는 속성을 읽는 데 도움이 되지 않습니다.아래 링크에 있는 SpringBoot 어플리케이션의 application.properties 파일에서 속성 값을 읽을 수 있는 전체 클래스를 게시했습니다.

스프링 부트 - Environment @Autowired가 Null Pointer를 슬로우합니다.예외.

당신의 문제는 당신이 필요로 하는 것이 PropertySourcesPlaceholderConfigurer[ Configuration ](설정) [Bean](빈)저는 강조해서 스태틱이라고 말했습니다.왜냐하면 저는 스태틱이 있었는데 작동하지 않았기 때문입니다.

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

서비스 클래스에서도 같은 문제가 있었습니다.@Value 대신 @ConfigurationProperties를 사용하여 해결했습니다.

  1. 다음과 같은 클래스를 만듭니다.
    import org.springframework.boot.context.properties.ConfigurationProperties;

    @ConfigurationProperties(prefix = "file")
    public class FileProperties {
        private String directory;

        public String getDirectory() {
            return directory;
        }

        public void setDirectory(String dir) {
            this.directory = dir;
        }
    }

  1. Boot Application 클래스에 다음 항목을 추가합니다.
    @EnableConfigurationProperties({
        FileProperties.class
    })
  1. FileProperties를 PrintProperty 클래스에 주입하면 getter 메서드를 통해 속성을 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/39047333/spring-boot-value-properties

반응형