【问题标题】:Could not autowire. No beans of 'RestTemplateBuilder' type found无法自动接线。找不到“RestTemplateBuilder”类型的 bean
【发布时间】:2020-11-05 00:01:15
【问题描述】:

我有一个通过电话号码发送通知的 Java-Spring 库(不是应用程序)。我正在使用 Rest 模板发送 POST 请求。但是我不想创建一个新的 RestTemplate 对象,而是想使用 RestTemplateConfiguration @Configuration 来做到这一点。

  1. IntelliJ 版本 - 2020.2
  2. 春天 - 2.3.3.RELEASE
  3. Java - 11

第 1 期 - 当我尝试创建 RestTemplateConfiguration 类时,出现错误 - Could not autowire. No beans of 'RestTemplateBuilder' type found.

@Configuration
public class RestTemplateConfiguration {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
}

第 2 期 如果我创建 RestTemplateBuilder 的新对象,它不会给出错误,但这不是我希望这个类的行为方式。此外,这在类(下面提到)SamplePhoneNumbers.java 中似乎不起作用,我尝试使用RestTemplate restTemplate。它以 null 的形式出现。

@Configuration
public class RestTemplateConfiguration {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplateBuilder builder = new RestTemplateBuilder;
        return builder.build();
    }
}

这是发送通知的类,也是我尝试使用 Rest 模板的地方。

@Slf4j
public class SamplePhoneNumbers implements SampleClassStratergy {

    RestTemplate restTemplate;
    private static SamplePhoneNumbers samplePhoneNumbers = null;
    private String phoneNumbersNotificationServiceURL = Enums.NotificationURL.enum_value + Enums.PhoneNumberApi.enum_value;

    SamplePhoneNumbers() {
        this.restTemplate = new RestTemplate();
    }

    public static SamplePhoneNumbers getInstance() {
        if(samplePhoneNumbers ==null) {
            samplePhoneNumbers = new SamplePhoneNumbers();
        }
        return samplePhoneNumbers;
    }

    @Async
    public void sendNotification(String title, String message, List<String> listOfPhoneNumbers) {
        SmsMessage smsMessage= new SmsMessage(title, message, listOfPhoneNumbers, Collections.emptyList(), Collections.emptyList());

        try {
            HttpEntity<SmsMessage> newRequest = new HttpEntity<>(smsMessage);
            restTemplate.postForObject(phoneNumbersNotificationServiceURL, newRequest, String.class);
            log.info("Notification sent via phone number.");
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }
}

第三期:有什么办法可以摆脱 getInstance() 方法,这样我就不必处理单例逻辑了?如果我可以将类创建为 bean,我猜应该可以,但我不确定在这种情况下如何实现。

由于这是一个库,它没有 main 方法,也没有 @SpringBootapplicationContext。

有人可以帮我解决吗?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    您想在 Spring Boot 应用程序中调用您的 Java-Spring LIBRARY 吗?如果是这样,你应该在spring boot application main方法中添加@ComponentScan,如下所示。

    pacakge com.prod
    
    // for instance, Java-Spring LIRARY package is com.third
    @SpringBootApplication
    @ComponentScan(basePackages={"com.prod","com.third"})
    public class Application {
    
    

    那么你应该这样做:

    
    @Configuration
    public class RestTemplateConfiguration {
        
        @Bean(name="myRestTemplate")
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
    @Slf4j
    @Component
    public class SamplePhoneNumbers implements SampleClassStratergy {
    
        @Autowired
        @Qualifier("myRestTemplate")
        RestTemplate restTemplate;
    
            @Async
        public void sendNotification(String title, String message, List<String> listOfPhoneNumbers) {
            SmsMessage smsMessage= new SmsMessage(title, message, listOfPhoneNumbers, Collections.emptyList(), Collections.emptyList());
    
            try {
                HttpEntity<SmsMessage> newRequest = new HttpEntity<>(smsMessage);
                restTemplate.postForObject(phoneNumbersNotificationServiceURL, newRequest, String.class);
                log.info("Notification sent via phone number.");
            } catch (Exception e) {
                log.error(e.getMessage());
            }
        }
    }
    
    

    【讨论】:

      【解决方案2】:

      我在运行 Junit 测试用例时也遇到了类似的错误,并通过添加一个 bean 来解决它 -

      @Bean
          public RestTemplateBuilder restTemplateBuilder() {
      
              return new RestTemplateBuilder();
          }
      

      【讨论】:

        猜你喜欢
        • 2021-01-17
        • 2019-08-17
        • 2021-07-02
        • 2020-08-31
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多