私は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;
// ....
}
残念ながら、私はそのような機能についてのドキュメントで何かを見つけていません...どうもありがとうございました!
私はあなたがしようとしているのとほぼ同じことを達成しました。まず、各プロパティ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;
}
この投稿に続いて 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検証を除き、完全に機能しました。
プロパティの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には正しく構成されたインスタンスを取得できないという問題があると思います。これは、おそらく構成メソッドのプロキシが欠落しているためです。