【问题标题】:Spring rest template cannot convert from text/htmlSpring rest 模板无法从 text/html 转换
【发布时间】:2018-12-28 16:24:12
【问题描述】:

Spring rest 模板向我抛出以下异常

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class [Lcom.flightsms.core.dto.AirlineResponseDTO;] and content type [text/html;charset=UTF-8]

这是我的 json 响应

[
 {
  "airlineId": "1",
  "nameAirline": "American Airlines",
  "codeIataAirline": "AA",
  "iataPrefixAccounting": "1",
  "codeIcaoAirline": "AAL",
  "callsign": "AMERICAN",
  "type": "scheduled",
  "statusAirline": "active",
  "sizeAirline": "963",
  "ageFleet": "10.9",
  "founding": "1934",
  "codeHub": "DFW",
  "nameCountry": "United States",
  "codeIso2Country": "US"
 }
]

dto类

@Data
public class AirlineResponseDTO {
  private String airlineId;
  private String nameAirline;
  private String codeIataAirline;
  private String iataPrefixAccounting;
  private String codeIcaoAirline;
  private String callsign;
  private String type;
  private String statusAirline;
  private String sizeAirline;
  private String ageFleet;
  private String founding;
  private String codeHub;
  private String nameCountry;
  private String codeIso2Country;
}

我怀疑问题出在转换器中。我更改了转换器配置,但这不起作用

@Configuration
public class MvcConfigSupport extends WebMvcConfigurationSupport {
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
        addDefaultHttpMessageConverters(converters);
    }

    @Bean
    MappingJackson2HttpMessageConverter converter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML));
        return converter;
    }
}

【问题讨论】:

  • 我看到你的内容类型是text/html;charset=UTF-8;我想您应该创建一个类似于APPLICATION_JSON_UTF8 的自定义MediaType,它是使用APPLICATION_JSON_UTF8_VALUE 构建的

标签: json spring rest resttemplate


【解决方案1】:

问题解决了。

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_HTML));
    restTemplate.getMessageConverters().add(converter);
    return restTemplate;
}

【讨论】:

  • 这似乎是我的解决方案? ;-) 很高兴知道帮助。
【解决方案2】:

尝试默认转换器不默认注册,最终用户必须明确注册默认值:

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

@Bean
public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
       MappingJackson2HttpMessageConverter jsonConverter = 
       new MappingJackson2HttpMessageConverter();

       ObjectMapper objectMapper = new ObjectMapper(); 

       objectMapper.configure(
       DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);

       jsonConverter.setObjectMapper(objectMapper);
       return jsonConverter;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> 
                                       converters) {
            converters.add(customJackson2HttpMessageConverter());
            super.addDefaultHttpMessageConverters();
}
 } 

此外,请尝试修复类型异常。从服务接收的内容类型[text/html;charset=UTF-8],真正的内容类型应该是application/json;charset=UTF-8

要获取所有 ContentType,您可以像这样进行自定义转换器:

List<HttpMessageConverter<?>> messageConverters = 
new ArrayList<HttpMessageConverter<?>>();        

MappingJackson2HttpMessageConverter converter = 
new MappingJackson2HttpMessageConverter();

converter.setSupportedMediaTypes(Arrays.asList({MediaType.ALL}));         
messageConverters.add(converter);  
restTemplate.setMessageConverters(messageConverters);  

【讨论】:

  • 试试我回答的第二部分应该会有所帮助。
【解决方案3】:

使用RestTemplateBuilders 创建resttemplate 客户端。构建器将添加默认的消息转换器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多