5

I tried to integrate test Spring Boot application, now I got one issue

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class org.springframework.http.ResponseEntity] and content type [application/x-json;charset=iso-8859-1]

    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:917)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:901)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)
    at org.springframework.boot.test.web.client.TestRestTemplate.exchange(TestRestTemplate.java:735)

If I do below

    @Before
    public void init() {
        List<HttpMessageConverter<?>> converters = restTemplate.getRestTemplate().getMessageConverters();
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter;
                jsonConverter.setObjectMapper(new ObjectMapper());
                jsonConverter.setSupportedMediaTypes(ImmutableList
                        .of(new MediaType("application", "x-json", Charset.forName("iso-8859-1"))));
            }
        }
    }

I added the application/x-json and iso8859-1 support to MappingJackson2HttpMessageConverter, it can works well. This is an workaround, but I want to know why the response content-type is application/x-json;charset=iso-8859-1? I have the produces configuration in my controller

@RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = "application/json;charset=UTF-8")

Does someone know how to config it and let the response use "application/json;charset=UTF-8" content type?

Below is my test method

    @Autowired
    protected TestRestTemplate restTemplate;
    @Test
    public void testGetPerformanceObligationById() {
        PerformanceObligationEntity entity = restTemplate.getForObject("/performance-obligations/{id}", PerformanceObligationEntity.class, "InvalidId");
        Assert.assertNull(entity.getId());
    }

I added one filter

    @TestConfiguration
    static class Config {
        @Bean
        public CharacterEncodingFilter characterEncodingFilter() {
            final CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
            characterEncodingFilter.setEncoding("UTF-8");
            characterEncodingFilter.setForceEncoding(true);
            return characterEncodingFilter;
        }

    }

Also modify the converter to

    @Before
    public void init() {
        List<HttpMessageConverter<?>> converters =
                restTemplate.getRestTemplate().getMessageConverters();
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter;
                jsonConverter.setObjectMapper(new ObjectMapper());
                jsonConverter.setSupportedMediaTypes(ImmutableList
                        .of(new MediaType("application", "x-json", Charset.forName("UTF-8"))));
            }
        }
    }

Now I got application/x-json;charset=utf-8, so just remain how to config from application/x-json to application/json

Tony
  • 351
  • 4
  • 16

0 Answers0