json SpringTemplate 没有找到适合响应类型的 HttpMessageConverter

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28131139/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 17:43:14  来源:igfitidea点击:

SpringTemplate no suitable HttpMessageConverter found for response type

jsonspringHymanson

提问by Gleeb

I am getting the following error while using spring rest template but i have defined Hymanson for json responses.

使用 spring 休息模板时出现以下错误,但我已为 json 响应定义了 Hymanson。

As well when I query to the url with rest client i get a good response.

同样,当我使用 rest 客户端查询 url 时,我得到了很好的响应。

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [tripadvisor.TripAdvisorResponse<java.util.List<model.external.tripadvisor.TripAdvisorLocation>>] and content type [text/javascript;charset=utf-8]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:812)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:796)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:576)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:544)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:495)
at sync.service.location.LocationServiceImpl.syncTripAdvisorLocations(LocationServiceImpl.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.call(AsyncExecutionInterceptor.java:110)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [tripadvisor.TripAdvisorResponse<java.util.List<model.external.tripadvisor.TripAdvisorLocation>>] and content type [text/javascript;charset=utf-8]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:812)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:796)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:576)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:544)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:495)
at sync.service.location.LocationServiceImpl.syncTripAdvisorLocations(LocationServiceImpl.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.call(AsyncExecutionInterceptor.java:110)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

rest template configuration:

休息模板配置:

@Bean
public ClientHttpRequestFactory httpRequestFactory() {
    return new HttpComponentsClientHttpRequestFactory(httpClient());
}
@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
    List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
    for (HttpMessageConverter<?> converter : converters) {
        if (converter instanceof MappingHymanson2HttpMessageConverter) {
            MappingHymanson2HttpMessageConverter jsonConverter = (MappingHymanson2HttpMessageConverter) converter;
            jsonConverter.setObjectMapper(new ObjectMapper());
        }
    }
    return restTemplate;
}
@Bean
public HttpClient httpClient() {
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
    CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();
    connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTIONS);
    connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_CONNECTIONS_PER_ROUTE);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("facebook.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("twitter.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("linkedin.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("viadeo.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("api.tripadvisor.com")), 20);
    return closeableHttpClient;
}
@Bean
public ClientHttpRequestFactory httpRequestFactory() {
    return new HttpComponentsClientHttpRequestFactory(httpClient());
}
@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
    List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
    for (HttpMessageConverter<?> converter : converters) {
        if (converter instanceof MappingHymanson2HttpMessageConverter) {
            MappingHymanson2HttpMessageConverter jsonConverter = (MappingHymanson2HttpMessageConverter) converter;
            jsonConverter.setObjectMapper(new ObjectMapper());
        }
    }
    return restTemplate;
}
@Bean
public HttpClient httpClient() {
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
    CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();
    connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTIONS);
    connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_CONNECTIONS_PER_ROUTE);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("facebook.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("twitter.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("linkedin.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("viadeo.com")), 20);
    connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("api.tripadvisor.com")), 20);
    return closeableHttpClient;
}

回答by mavarazy

Default media type for MappingHymanson2HttpMessageConverters is

MappingHymanson2HttpMessageConverters 的默认媒体类型是

/**
 * Construct a new {@code BindingHymansonHttpMessageConverter}.
 */
public MappingHymanson2HttpMessageConverter() {
    super(new MediaType("application", "json", DEFAULT_CHARSET));
}

You can specify media type for MappingHymanson2HttpMessageConverter in your bean definition, like this

您可以在 bean 定义中为 MappingHymanson2HttpMessageConverter 指定媒体类型,如下所示

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
    List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
    for (HttpMessageConverter<?> converter : converters) {
        if (converter instanceof MappingHymanson2HttpMessageConverter) {
            MappingHymanson2HttpMessageConverter jsonConverter = (MappingHymanson2HttpMessageConverter) converter;
            jsonConverter.setObjectMapper(new ObjectMapper());
            jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("application", "json", MappingHymanson2HttpMessageConverter.DEFAULT_CHARSET), new MediaType("text", "javascript", MappingHymanson2HttpMessageConverter.DEFAULT_CHARSET)));
        }
    }
    return restTemplate;
}

or using wildcard

或使用通配符

jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("*", "json", MappingHymanson2HttpMessageConverter.DEFAULT_CHARSET), new MediaType("*", "javascript", MappingHymanson2HttpMessageConverter.DEFAULT_CHARSET)));