Spring BootのRestTemplateCustomizerは複数使えるのか

最近異動してSpring Bootをさわるようになったので、これからそのあたりの知見も勉強の記録として書こうと思う。Spring Boot超初心者かつ最新のJavaからもしばらく離れていた人間が書いている内容なので注意。

Spring Bootアプリケーションから別のサーバにhttpリクエストを投げる時はRestTemplateを使えばよいらしい。通常はRestTemplate インスタンスを作るのには、RestTemplateBuilder を使えば良さそう。

また、アプリケーション全体でhttpリクエストに共通のカスタマイズを入れたい場合は、RestTemplateCustomizer インタフェースを継承したBeamを作れば良いらしい。

https://spring.pleiades.io/spring-boot/docs/2.4.4/reference/html/spring-boot-features.html#boot-features-resttemplate-customization

アプリケーション全体で追加のカスタマイズを行うには、RestTemplateCustomizer Bean を使用します。このような Bean はすべて、自動構成された RestTemplateBuilder に自動的に登録され、それを使用して作成されたすべてのテンプレートに適用されます。

15.1. RestTemplateのカスタマイズ

RestTemplateCustomizerを継承したBeanを書いておけば、自動的にRestTemplateBuilderにinjectされるようだ。

ところで、仕事で複数のRestTemplateCustomizerの実装があり、ひとつが動いていないという不具合に遭遇していた。複数あることが原因ではないかという仮説があったのだが、実装を調べたところ、

spring-boot/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java at d1eb9d53ab4f13cf97ecc1684cc98894668d66c8 · spring-projects/spring-boot
Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.
	private final Set<RestTemplateCustomizer> customizers;

と複数保持できるようになっている。コンストラクタは

	public RestTemplateBuilder(RestTemplateCustomizer... customizers) {
...
           this.customizers = copiedSetOf(customizers);

こんな感じなので、おそらく複数のBeanがあっても、一つだけということではなく、それらがインジェクトされるのではないだろうか。

コメント

タイトルとURLをコピーしました