web-dev-qa-db-ja.com

Spring Boot:異なるプレフィックスを持つ複数の同様のConfigurationProperties

私はSpring Bootを使用しており、application.ymlで設定したい2つの非常に類似したサービスを持っています。

構成はおおよそ次のようになります。

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

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

@ConfigurationPropertiesアノテーションが付けられた1つのクラスを作成し、注入ポイントにプレフィックスを設定することは可能ですか?

例えば.

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

   // Getters & Setters
}

そして、サービス自体で:

public class ServiceA {

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

   // ....
}

残念ながら、私はそのような機能についてのドキュメントで何かを見つけていません...どうもありがとうございました!

6
nioe

私はあなたがしようとしているのとほぼ同じことを達成しました。まず、各プロパティBeanを登録します。

@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;

}
10
Javvano

この投稿に続いて 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());
    }
}
1
Jairo Martínez

Javvanosの例は、JavaBean検証を除き、完全に機能しました。

プロパティの1つに@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には正しく構成されたインスタンスを取得できないという問題があると思います。これは、おそらく構成メソッドのプロキシが欠落しているためです。

0
Qnob