Estoy tratando de consumir REST API que toma JSON carga útil y devuelve texto sin formato en la respuesta. Pero recibo el siguiente error durante el tiempo de ejecución.

SpotifyIntegrationApplication.java

@SpringBootApplication
public class SpotifyIntegrationApplication {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpotifyIntegrationApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(SpotifyIntegrationApplication.class, args);
    }

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

    @Bean
    public CommandLineRunner run(RestTemplate restTemplate) {
        NewOrder newOrder = new NewOrder();
        return args -> {
            ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost:9999/order-sold", newOrder, String.class);
            LOGGER.info("responseEntity: " + responseEntity);
        };
    }

}

NewOrder.java

public class NewOrder {
    String orderId;
}

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.10.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.synapse.integration'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('com.h2database:h2')
    runtime('mysql:mysql-connector-java')
    compileOnly('org.projectlombok:lombok')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

Error:

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:735) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:716) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:703) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:304) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    at com.synapse.integration.spotify.SpotifyIntegrationApplication.main(SpotifyIntegrationApplication.java:20) [classes/:na]
Caused by: org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [com.synapse.integration.spotify.model.NewOrder]
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:907) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:658) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:415) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at com.synapse.integration.spotify.SpotifyIntegrationApplication.lambda$run$0(SpotifyIntegrationApplication.java:32) [classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:732) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
    ... 6 common frames omitted
2
Nital 27 feb. 2018 a las 18:21

4 respuestas

La mejor respuesta
 I have used restTemplate.exchange but you can modify to use postForEntity 
 or postForObject. Hope this helps.

 private HttpHeaders createHttpHeaders() {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    return headers;
    }

@RequestMapping("/testClient")
public String testClient() {
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = createHttpHeaders();
    HttpEntity<String> entity = new HttpEntity<String>("parameters",
            headers);
    ResponseEntity<String> response = restTemplate.exchange(url,
            HttpMethod.GET, entity, String.class);
    if (response.getStatusCode().equals(HttpStatus.OK)) {
        System.out.println("getbody -" + response.getBody());
    }
    return "Test Client";
}
1
JaisAnkit 27 feb. 2018 a las 16:10

Si la solicitud realizada solo acepta json, proporcione encabezados que especifiquen el tipo de contenido y convierta el objeto a json (use Gson para convertir el objeto a json) y realice una solicitud de publicación estableciendo todo esto en una HttpEntity

HttpHeaders headers = new HttpHeaders();
headers.add("content-type", "application/json");
headers.add("accept", "application/json");

String requestBody = gson.toJson(requestObject);

HttpEntity<String> httpEntity = new HttpEntity(requestBody,headers);

Y hacer que el resto llame como

restTemplate.exchange(requestUrl,HttpMethod.POST,httpEntity,MyResponse.class)
0
Chaitanya 27 feb. 2018 a las 16:20

Hmm, las respuestas son un poco confusas, al mirar la documentación de Spring en: https://spring.io/guides/gs/consuming-rest/

Parece que debería poder consumir con éxito una respuesta, asignar a un objeto JSON a través de un objeto anotado.

Sin embargo, incluso al hacer esto:

@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
    return args -> {
        Quote quote = restTemplate.getForObject(
                "http://localhost:8978/greeting", Quote.class);
        System.out.println(quote.toString());
        log.info(quote.toString());      
    };

Todavía recibo lo anterior Error al ejecutar CommandLineRunner, tendré que investigar si realmente vale la pena asignarlo al HttpResponseObject. Espero que haya algunos pensamientos sobre mi comentario aquí.

0
Arsalan Khalid 24 may. 2018 a las 15:40

Encontré la solución de las respuestas anteriores más algunas búsquedas adicionales en Google.

SpotifyIntegrationApplication.java

@SpringBootApplication
public class SpotifyIntegrationApplication {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpotifyIntegrationApplication.class);
    public static final String ENDPOINT = "http://localhost:9999/order-sold";

    public static void main(String[] args) {
        SpringApplication.run(SpotifyIntegrationApplication.class, args);
    }

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

    @Bean
    public CommandLineRunner run(RestTemplate restTemplate) {
        return args -> {
            NewOrder newOrder = new NewOrder();
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<NewOrder> entity = new HttpEntity<>(newOrder, headers);
            ResponseEntity<String> responseEntity = restTemplate.exchange(ENDPOINT, POST, entity, String.class);
            LOGGER.info("responseEntity: " + responseEntity);
        };
    }

}

NewOrder.java

@Data
public class NewOrder {

    private String orderId;

}

Aunque esto no era parte de la pregunta original, también eliminó la dependencia de la biblioteca Tomcat, ya que solo estoy consumiendo la API y no estoy compilando una.

build.gradle

compile('org.springframework.boot:spring-boot-starter-web') {
    exclude module: "spring-boot-starter-tomcat"
}
0
Nital 5 mar. 2018 a las 19:36