web-dev-qa-db-fra.com

Comment transférer automatiquement RestTemplate à l'aide d'annotations

Lorsque j'essaie d'autowire Spring RestTemplate, le message d'erreur suivant s'affiche:

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.client.RestTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

Utilisation de Spring 4 dans un environnement piloté par des annotations.

Mon servlet de distributeur est configuré comme suit:

<context:component-scan base-package="in.myproject" />
<mvc:default-servlet-handler />    
<mvc:annotation-driven />
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>

Ma classe dans laquelle j'essaie d'autowire RestTemplate est la suivante:

@Service("httpService")
public class HttpServiceImpl implements HttpService {

@Autowired
private RestTemplate restTemplate;

@Override
public void sendUserId(String userId){

    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("userId", userId);
    map.add("secretKey", "kbhyutu7576465duyfy");

    restTemplate.postForObject("http://localhost:8081/api/user", map, null);


    }
}
44
meeti sharma

Les erreurs que vous verrez si un RestTemplate n'est pas défini

Pensez à définir un bean de type 'org.springframework.web.client.RestTemplate' dans votre configuration.

ou

Aucun bean qualifiant de type [org.springframework.web.client.RestTemplate] trouvé

Comment définir un RestTemplate via des annotations

Selon les technologies que vous utilisez et les versions qui influenceront la façon dont vous définissez un RestTemplate dans votre @Configuration classe.

Printemps> = 4 sans démarrage à ressort

Définissez simplement un @Bean:

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

Spring Boot <= 1.3

Nul besoin d'en définir un, Spring Boot en définit automatiquement un pour vous.

Spring Boot> = 1.4

Spring Boot ne définit plus automatiquement un RestTemplate, mais définit un RestTemplateBuilder, ce qui vous permet de mieux contrôler le RestTemplate créé. Vous pouvez injecter le RestTemplateBuilder comme argument dans votre @Bean méthode pour créer un RestTemplate:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
   // Do any additional configuration here
   return builder.build();
}

L'utiliser dans votre classe

@Autowired
private RestTemplate restTemplate;

ou

@Inject
private RestTemplate restTemplate;
85
dustin.schultz

Vous pouvez ajouter la méthode ci-dessous à votre classe pour fournir une implémentation par défaut de RestTemplate:

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

Si vous utilisez Spring Boot 1.4.0 ou une version ultérieure comme base de votre gestion par annotation, Spring ne fournit pas un seul bean RestTemplate auto-configuré. De leur documentation:

https://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/html/boot-features-restclient.html

Si vous devez appeler des services distants REST à partir de votre application, vous pouvez utiliser la classe RestTemplate de Spring Framework. Étant donné que les instances RestTemplate doivent souvent être personnalisées avant d'être utilisées, Spring Boot ne fournit aucune procédure automatique. Le bean RestTemplate configuré configure automatiquement un RestTemplateBuilder qui peut être utilisé pour créer des instances RestTemplate en cas de besoin.Le RestTemplateBuilder auto-configuré garantit que les HttpMessageConverters sensibles sont appliqués aux instances RestTemplate.

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

@Configuration
public class RestTemplateClient {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
6
Kumar
@Autowired
private RestOperations restTemplate;

Vous pouvez uniquement utiliser des interfaces autowire avec des implémentations.

2
riship89