sourcecode

프로필을 spring.profiles.include로 포함하면 include 대신 재정의되는 것 같습니다.

copyscript 2023. 7. 8. 11:06
반응형

프로필을 spring.profiles.include로 포함하면 include 대신 재정의되는 것 같습니다.

여러 Spring Boot 응용 프로그램에 대한 구성 속성을 파티셔닝하려고 합니다.저는 Spring Boot 1.1.6을 사용하고 있으며, 우리의 구성 속성은 일반적인 application.yml 스타일로 YAML로 표현되어 있습니다.공통 기본 매개변수, 공통 DB 매개변수 등에 대한 다양한 프로파일을 만들었습니다.스프링 부트 참조 문서에 언급된 포함 기능을 사용하려고 했지만, 포함이 아닌 오버라이드로 작동하는 것 같습니다.즉, 제가 원하는 것과 정반대입니다.application.yml의 다음 내용을 고려할 때, 막대 프로파일이 활성화될 때 속성 이름에 값 표시줄이 있을 것으로 예상했지만, 대신 (포함된 프로파일에서) foo로 설정됩니다.포함한다는 개념은 먼저 로드되고 새 프로필에 설정된 동일한 이름의 속성이 포함된 프로필의 속성보다 우선한다는 것을 의미한다고 생각했습니다.하위 클래스가 슈퍼 클래스의 필드를 음영 처리하는 경우 하위 클래스의 인스턴스는 음영 처리된 값을 반영합니다.파일은 다음과 같습니다.

spring:
  profiles: foo
name: foo

--- # New YAML doc starts here

spring:
  profiles: 
    include: foo
  profiles: bar
name: bar

"bar" 프로필이 명시적으로 활성화된 테스트 사례에서 이를 실행해도 이름 속성은 여전히 foo:

SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
SpringApplication app = builder.application();
builder.profiles("bar");
ConfigurableApplicationContext ctxt = app.run();
String name = ctxt.getEnvironment().getProperty("name"); // Is always "foo" much to my surprise

하지만, 제가 논평을 낸다면 다음을 포함합니다.

spring: 
profiles: bar
#  profiles: 
#    include: foo

내 코드에서 명시적으로 두 프로파일을 활성화합니다.

builder.profiles("foo", "bar");

그러면 예상대로 작동하고 이름 속성이 막대로 설정됩니다.YAML 파일에 포함된 파일을 처리하는 주된 이유는 실제 코드에 미치는 영향이 적고 모든 프로필 포함을 한 곳에서 관리할 수 있기 때문입니다.다른 접근 방식에서는 프로필 이름을 변경하려면 전체 프로젝트에서 프로필 문자열과 가능한 @Profile 주석을 검색해야 합니다.확실히 오류가 발생하기 쉽습니다.포함된 프로파일이 하위 프로파일 값을 재정의하는지 여부를 명시적으로 표현할 수 있는 것이 더 유연한 해결책이라고 생각합니다.아마도 다음과 같은 것일 것입니다.

spring:
  profiles: bar
  profiles:
    include: foo
      override: false

아마 제가 여기서 뭔가를 놓치고 있는 것 같아요.이것을 하는 더 좋은 방법이 있습니까?감사해요.

다음을 사용하여 foot를 포함하되 bar를 재정의하십시오. 내 솔루션에 효과가 있는 것 같습니다.

spring:
    profiles:
        include: bar
        active: foo,bar

편집: 공식적으로 지원되지 않으며 2016년 버전용이라는 점에 유의하십시오.

언급URL : https://stackoverflow.com/questions/25985752/including-profiles-with-spring-profiles-include-seems-to-override-instead-of-inc

반응형