Lombokの@RequiredArgsConstructorでコンストラクタインジェクションする際に@QualifierアノテーションでBean指定してもエラーとなる

Lombokの@RequiredArgsConstructorでコンストラクタインジェクションする際に@QualifierアノテーションでBean指定してもエラーとなる

AppConfigクラスでBeanをname属性を指定して指定します。

package jp.co.confrage.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfifg {
  @Bean(name = "restTemplate1")
  public RestTemplate restTemplate1() {
    var ret = new RestTemplate();
    return ret;
  }

  @Bean(name = "restTemplate2")
  public RestTemplate restTemplate2() {
    var ret = new RestTemplate();
    return ret;
  }
}

Lombokの@RequiredArgsConstructorアノテーションでコンストラクタインジェクションを使用した際に、@QualifierアノテーションでBean名を指定してインジェクションしようとすると、「Parameter 0 of constructor in jp.co.confrage.presentation.controller.XXXController required a single bean, but 2 were found」というエラーが発生します。

回避するには、プロジェクト直下にlombok.configというファイルを作成し、以下1行記述します。

lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

コントローラクラスにprivate finalで@Qualifierを指定します。

package jp.co.confrage.presentation.controller;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
public class XXXController {

  @Qualifier("restTemplate1")
  private final RestTemplate restTemplate1;

  @Qualifier("restTemplate2")
  private final RestTemplate restTemplate2;

  @RequestMapping(path = "/{userId}" + "/{pass}", method = RequestMethod.GET)
  public void signin(@PathVariable String userId, @PathVariable String pass) {
    // 省略
  }
}

これでエラーは回避されます。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

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