org.springframework.web.client.RestTemplate, как ожидается, будет объявлен как @Bean и обычная ошибка @Autowired throws - PullRequest
0 голосов
/ 27 сентября 2019

Мне понадобился объект RestTemplate в моем @RestController классе "personController", поэтому я объявил его, как показано ниже.

@Autowired
 private RestTemplate restTemplate;

, когда я попытался использовать его, я получил приведенное ниже поле ошибки restTemplate в com.example.demo.api.PersonController требуется компонент типа org.springframework.web.client.RestTemplate, который не может быть найден.Подумайте об определении bean-компонента типа org.springframework.web.client.RestTemplate в вашей конфигурации.

Чтобы преодолеть ошибку, я объявляю @Bean для повторного шаблона, как показано ниже в файле config.java, и он работает нормально и не выдает никакой ошибки.

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate;
}

Я использую com.fasterxml.jackson.databind.ObjectMapper объект в @Service классе "personService", и я автоматически подключил его, как показано ниже.

@Autowired
private ObjectMapper objectMapper;

Я могу использовать объект сопоставления без объявления каких-либобоб для него и его нормально работает.Я хотел понять,

  1. Почему objectmapper работает без bean-компонента, но resttemplate не работает без bean-компонента и ожидает, что bean-компонент будет объявлен?
  2. Когда создавать бин, а когда просто использовать обычный @Autowired без бобов?как я могу узнать это, посмотрев на нее?

Ответы [ 5 ]

0 голосов
/ 27 сентября 2019

Как говорят другие пользователи, это правильно, по умолчанию не существует bean-компонента, определенного Spring для RestTemplate.Предпочтительным методом является использование org.springframework.boot.web.client.RestTemplateBuilder для построения шаблона отдыха.

пример, приведенный ниже.

@Service
public class RestServiceCaller {

  private RestTemplate restTemplate;

  @Autowired
  RestServiceCaller(RestTemplateBuilder builder) {
     restTemplate = builder.build();
  }

 ........
 .....//here you will have other methods which make use of this restTemplate
}

Из JavaDoc restTemplateBuilder -> "В типичном автоматически конфигурируемом приложении Spring Boot этот компоновщик доступен в виде компонента и может быть внедрен, когда требуется RestTemplate."

0 голосов
/ 27 сентября 2019

Как говорится в весенних документах.https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-resttemplate.html

Если вам нужно вызывать удаленные службы REST из своего приложения, вы можете использовать класс RestTemplate Spring Framework.Поскольку экземпляры RestTemplate часто необходимо настраивать перед использованием, Spring Boot не предоставляет ни одного автоматически настроенного компонента RestTemplate.Однако он автоматически настраивает RestTemplateBuilder, который можно использовать для создания экземпляров RestTemplate при необходимости.Автоматически настроенный RestTemplateBuilder гарантирует, что разумные HttpMessageConverters будут применены к экземплярам RestTemplate.

0 голосов
/ 27 сентября 2019
Bean-компонент

ObjectMapper создан Spring Boot, поскольку в вашем пути к классам присутствует класс ObjectMapper, который вызывает JacksonAutoConfiguration.Вот почему вы можете автоматически связывать этот компонент без явного его создания.

RestTemplate С другой стороны, это компонент, который вы должны создать самостоятельно - Spring не сделает это за вас, так как нет автоматической настройкикласс, который может вызвать его создание.

0 голосов
/ 27 сентября 2019

Скорее всего, ObjectMapper входит в контекст через одну из перекрестных или транзитивных зависимостей вашего проекта, но RestTemplate - нет.Таким образом, экземпляр ObjectMapper создается неявно, тогда как RestTemplate вообще не создается.Вот почему вы должны явно создать боб RestTemplate.

0 голосов
/ 27 сентября 2019

ObjectMapper работает, потому что есть другой сторонний код (например, Джексон), который использует этот компонент (и он настроен ими).Вы просто пользуетесь этим, автоматически подключая его к своим собственным компонентам.

RestTemplate с другой стороны не предоставляется в качестве компонента третьей стороной в вашей базе кода (это может прийти через зависимость).Поэтому вы сами можете создать его компонент, если хотите.

Вы не можете предполагать, что что-то является компонентом, если не знаете его, поэтому документация - это ваше первое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...