无法自动装配。未找到“RestTemplateBuilder”类型的 bean

P_u*_*526 5 java spring spring-boot

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

  1. IntelliJ 版本 - 2020.2
  2. 春季 - 2.3.3.RELEASE
  3. 爪哇 - 11

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

@Configuration
public class RestTemplateConfiguration {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个问题如果我创建 RestTemplateBuilder 的新对象,它不会给出错误,但这不是我希望此类的行为方式。另外,在类(下面提到) SamplePhoneNumbers.java 中,这似乎不起作用,我尝试使用RestTemplate restTemplate. 它即将变为空。

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

这是发送通知的类,我正在尝试使用 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以帮我解决问题吗?

小智 7

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

@Bean
public RestTemplateBuilder restTemplateBuilder() {
    return new RestTemplateBuilder();
}
Run Code Online (Sandbox Code Playgroud)


jac*_*neo 2

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

pacakge com.prod

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

Run Code Online (Sandbox Code Playgroud)

那么你应该执行以下操作:


@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());
        }
    }
}

Run Code Online (Sandbox Code Playgroud)