복붙노트

[SPRING] application.properties에서 값 읽기 Spring Boot

SPRING

application.properties에서 값 읽기 Spring Boot

내 스프링 부팅 응용 프로그램에는 다음 응용 프로그램 구조가 있습니다.

이것은 내 application.properties 파일입니다.

logging.level.org.springframework=TRACE
logging.level.org.hibernate=ERROR
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
#spring.resources.chain.cache=false
#spring.resources.chain.html-application-cache=false
#spring.headers.cache=false
language=java

그 언어 = 자바 속성을 사용해야하는 클래스가 있습니다. 이것은 그것을 사용하려고하는 방법입니다 :

public class EntityManager {

    @Value("${language}")
    private static String newLang;

    public EntityManager(){
        System.out.println("langauge is: " + newLang);
    }
}

그 인쇄 된 값은 어떤 이유로 든 항상 "null"입니다! 나는 이것을 클래스 선언의 맨 위에 넣으려고했다.

@PropertySource(value = "classpath:application.properties")

해결법

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

    1.여러 가지 방법으로 달성 할 수 있습니다. 아래를 참조하십시오.

    여러 가지 방법으로 달성 할 수 있습니다. 아래를 참조하십시오.

    @Configuration
    @PropertySource("classpath:application.properties")
    public class EntityManager {
    
        @Value("${language}")
        private static String newLang;
    
        @Bean
        public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
            return new PropertySourcesPlaceholderConfigurer();
        }
    
    }
    

    또는

    @Configuration
    @PropertySource("classpath:application.properties")
    public class EntityManager {
    
        @Autowired
        private Environment env;
    
        public void readProperty() {
            env.getProperty("language");
        }
    
    }
    
  2. ==============================

    2.스프링 부트를 사용하고 있다면 스프링 부트 스타터 부모를 사용하는 경우 @PropertySource ( "classpath : application.properties")가 필요하지 않습니다. 정적 키워드 만 제거하면 작동이 시작됩니다.

    스프링 부트를 사용하고 있다면 스프링 부트 스타터 부모를 사용하는 경우 @PropertySource ( "classpath : application.properties")가 필요하지 않습니다. 정적 키워드 만 제거하면 작동이 시작됩니다.

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

    3.때때로 src / main / resources의 classpath 항목에 exclude 태그가 포함되어 있습니다. application.properties가이 제외 된 항목 목록에 있으면 @PropertySource ( "classpath : application.properties")는 등록 정보 파일을 찾을 수 없습니다.

    때때로 src / main / resources의 classpath 항목에 exclude 태그가 포함되어 있습니다. application.properties가이 제외 된 항목 목록에 있으면 @PropertySource ( "classpath : application.properties")는 등록 정보 파일을 찾을 수 없습니다.

    src / main / resources에 대한 [.classpath] [1] 파일에서 exclude 항목을 수동으로 제거하거나 Eclipse에서 빌드 경로 구성 옵션을 사용하여 소스 탭으로 이동하십시오. 그런 다음 src에서 제외 항목을 제거하십시오.

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

    4.클래스 상단에 스테레오 타입 주석이 없습니다.

    클래스 상단에 스테레오 타입 주석이 없습니다.

    @Component
    public class EntityManager {
    
        @Value("${language}")
        private static String newLang;
    
        public EntityManager(){
            System.out.println("langauge is: " + newLang);
        }
    }
    
  5. ==============================

    5.OK 나는 그것을 필사적으로 생각했다. 나는

    OK 나는 그것을 필사적으로 생각했다. 나는

    @PropertySource("classpath:application.properties") 
    

    속성이지만 여전히 어떤 이유로 작동하지 않았습니다.

    그런 다음 "정적"수정자를 삭제하고 효과가있었습니다!

    왜 거기에 "정적"없이 작동하는지 모르겠지만 그렇습니다. 이것이 나에게 설명 할 수 있다면 그것은 모두 혼란 스럽기 때문에 멋질 것입니다.

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

    6.콩 만들기

    콩 만들기

    @Configuration
    @PropertySource("classpath:application.properties")
    public class ApplicationBeansConfig {
    
        @Autowired
        Environment env;
    
        @Bean
        public IApplicationBeanService getService(){
            return new ApplicationBeansService(env);
        }
    }
    

    그리고 나서 서비스 생성자에서

    @Service
    public class ApplicationBeansService implements IApplicationBeanService {
    ...
       public ApplicationBeansService(Environment env){
          ...
          String value = env.getProperty("your.value")
          ...
       }
    ...
    }
    

    application.properties를 채우는 것을 잊지 마십시오.

    your.value = some-string-value
    
  7. ==============================

    7.위의 두 번째 대답에서 제공된 것처럼 실제로 스프링 부트를 사용 했으므로 static 키워드를 제거하고 해결했습니다. @Value로 정의 된 속성에 정적이 없는지 확인하십시오.

    위의 두 번째 대답에서 제공된 것처럼 실제로 스프링 부트를 사용 했으므로 static 키워드를 제거하고 해결했습니다. @Value로 정의 된 속성에 정적이 없는지 확인하십시오.

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

    8.@PropertySource를 사용하여 속성 파일의 경로를 지정하면 아래 예제를 찾을 수 있습니다.

    @PropertySource를 사용하여 속성 파일의 경로를 지정하면 아래 예제를 찾을 수 있습니다.

    @Component
    @PropertySource("classpath:application.properties")
    public class EntityManager {
    
        @Value("${language}")
        private static String newLang;
    
        public EntityManager(){
            System.out.println("langauge is: " + newLang);
        }
    }
    
  9. ==============================

    9.아마도 당신이 찾고있는 정확한 해결책이 아닐지 모르지만 프로퍼티 소스 빈을 선언 할 수도 있습니다 :

    아마도 당신이 찾고있는 정확한 해결책이 아닐지 모르지만 프로퍼티 소스 빈을 선언 할 수도 있습니다 :

    https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html

  10. ==============================

    10.내 경우에는 같은 문제가 약간 다른 원인이있다 - 나는 정적 인 인스턴스 변수 (우리가 Singleton 패턴을 구현하는 데 사용했던 예전의 일반적인 방법)를 가진 클래스를 갖고 있는데,이 클래스에 application.properties "정적"문제는 속성을 찾을 수없는 이유였습니다 - 아무런 오류도 없었습니다 : /).

    내 경우에는 같은 문제가 약간 다른 원인이있다 - 나는 정적 인 인스턴스 변수 (우리가 Singleton 패턴을 구현하는 데 사용했던 예전의 일반적인 방법)를 가진 클래스를 갖고 있는데,이 클래스에 application.properties "정적"문제는 속성을 찾을 수없는 이유였습니다 - 아무런 오류도 없었습니다 : /).

    게다가이 클래스는 @SpringBootApplication으로 선언 된 클래스와 완전히 다른 패키지에 있습니다. 나는 Spring Boot와 자동 컴포넌트 스캐닝을 통해 패키지 이름과 위치를 진지하게 고려해야한다는 것을 이해했다. 내 5 센트

  11. from https://stackoverflow.com/questions/45428826/reading-values-from-application-properties-spring-boot by cc-by-sa and MIT license