source

스프링 부트: 프리픽스가 다른 여러 유사한 Configuration Properties

bestscript 2023. 3. 11. 09:03

스프링 부트: 프리픽스가 다른 여러 유사한 Configuration Properties

Spring Boot을 사용하고 있으며, 두 가지 매우 유사한 서비스를 사용하고 있습니다.application.yml.

설정은 대략 다음과 같습니다.

serviceA.url=abc.com
serviceA.port=80

serviceB.url=def.com
serviceB.port=8080

주석달린 클래스 1개를 만들 수 있습니까?@ConfigurationProperties주입 지점에 프레픽스를 설정할 수 있습니까?

예.

@Component
@ConfigurationProperties
public class ServiceProperties {
   private String url;
   private String port;

   // Getters & Setters
}

서비스 자체에서 다음을 수행합니다.

public class ServiceA {

   @Autowired
   @SomeFancyAnnotationToSetPrefix(prefix="serviceA")
   private ServiceProperties serviceAProperties;

   // ....
}

유감스럽게도 문서에서는 이러한 기능에 대해 아무것도 찾을 수 없었습니다.도와주셔서 정말 감사합니다!

나는 네가 노력한 것과 거의 같은 것을 성취했다.먼저 각 속성을 콩으로 등록합니다.

@Bean
@ConfigurationProperties(prefix = "serviceA")
public ServiceProperties  serviceAProperties() {
    return new ServiceProperties ();
}

@Bean
@ConfigurationProperties(prefix = "serviceB")
public ServiceProperties  serviceBProperties() {
    return new ServiceProperties ();
}

서비스 시(또는 속성을 사용하는 장소)에는 @Qualifier를 입력하고 자동 배선되는 속성을 지정합니다.

public class ServiceA {
    @Autowired
    @Qualifier("serviceAProperties")
    private ServiceProperties serviceAProperties;

}

Spring Boot의 @ConfigurationProperties에 대한 이 투고 가이드에 따라 주석 없이 간단한 클래스를 만들 수 있습니다.

public class ServiceProperties {
   private String url;
   private String port;

   // Getters & Setters
}

그런 다음 @Bean 주석을 사용하여 @Configuration 클래스를 만듭니다.

@Configuration
@PropertySource("classpath:name_properties_file.properties")
public class ConfigProperties {

    @Bean
    @ConfigurationProperties(prefix = "serviceA")
    public ServiceProperties serviceA() {
        return new ServiceProperties ();
    }

    @Bean
    @ConfigurationProperties(prefix = "serviceB")
    public ServiceProperties serviceB(){
        return new ServiceProperties ();
    }
}

마지막으로 다음과 같은 속성을 얻을 수 있습니다.

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private ConfigProperties configProperties ;

    private void watheverMethod() {
        // For ServiceA properties
        System.out.println(configProperties.serviceA().getUrl());

        // For ServiceB properties
        System.out.println(configProperties.serviceB().getPort());
    }
}

Javvanos 예는 JavaBean Validation을 제외하고 완전히 동작했습니다.

다음 속성 중 하나에 @NotNull 주석을 달았습니다.

public class ServiceProperties {
   @NotNull
   private String url;
   private String port;

   // Getters & Setters

}

그 결과 응용 프로그램 부팅에 실패하고 다음 오류 메시지가 표시됩니다.

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target ch.sbb.hop.commons.infrastructure.hadoop.spark.SparkJobDeployerConfig@730d2164 failed:

    Property: url
    Value: null
    Reason: may not be null


Action:

Update your application's configuration

주석을 제거하면 응용 프로그램이 올바른 속성 바인딩으로 시작됩니다.결론적으로 JavaBean Validation이 올바르게 초기화되지 않은 것은 구성방식의 프록시가 없기 때문일 수 있습니다.

@ConfigurationProperties anotation에는 프리픽스 설정을 위한 필드가 있습니다.다음은 예를 제시하겠습니다.

@Component
@ConfigurationProperties(prefix = "b2gconfig")
public class B2GConfigBean {
    private  String account;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    private  String key;
}

그리고 application.properties 파일:

언급URL : https://stackoverflow.com/questions/49422952/spring-boot-multiple-similar-configurationproperties-with-different-prefixes