当前位置: 首页 > 知识库问答 >
问题:

没有找到适合响应类型的HttpMessageConzer

向俊贤
2023-03-14

我在使用SpringREST模板时遇到以下错误,但我已经为json响应定义了jackson。

当我使用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$1.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模板配置:

@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 MappingJackson2HttpMessageConverter) {
            MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) 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;
}

共有1个答案

融宏伟
2023-03-14

MappingJackson2HttpMessageConverters的默认媒体类型为

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

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

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

或者使用通配符

jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("*", "json", MappingJackson2HttpMessageConverter.DEFAULT_CHARSET), new MediaType("*", "javascript", MappingJackson2HttpMessageConverter.DEFAULT_CHARSET)));
 类似资料:
  • 使用Spring,使用以下代码: 我得到 pojo的一个片段:

  • 我得到以下异常,不知道为什么。。。 线程“main”组织中出现异常。springframework。网状物客户RestClientException:无法提取响应:在org上找不到响应类型[class com.avada.rest.UsersController$Users]和内容类型[application/json;charset=UTF-8]的合适HttpMessageConverter。s

  • 我有以下几点建议: 当我对它执行cucumber测试时,我得到以下异常: 我有一些其他的测试和其他具有相同注释的POJO,它们工作起来没有任何问题。我真的一点也不知道出了什么问题。 感谢任何建议!

  • 我试图得到下面给出的带有SpringRest模板的响应实体。我得到了下面的错误, 代码: 我在这篇文章中尝试将媒体类型设置为Application/json。但还是一样的错误。 完整跟踪:

  • 问题内容: 使用spring,使用以下代码: 我懂了 pojo的片段: 问题答案: 从Spring的角度来看,没有一个通过注册的实例可以将内容转换为对象。感兴趣的方法是。上述所有回报的实现,包括。 由于没有人可以读取您的HTTP响应,因此处理失败,并出现异常。 如果你能控制服务器响应,修改设置到,或东西匹配。 如果您不控制服务器响应,则需要编写和注册自己的(可以扩展Spring类,see 及其子类

  • org.springframework.web.client.未知内容类型异常:无法提取响应:没有找到适合响应类型[类net.minidev.json.JSONObject]和内容类型[应用程序/json]的HttpMessageConzer endpoint Url还返回JSONObject,因此不知道为什么不匹配