Ton*_*ony 5 content-type spring-test resttemplate spring-boot
我尝试集成测试 Spring Boot 应用程序,现在遇到一个问题
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)
Run Code Online (Sandbox Code Playgroud)
如果我做如下
@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"))));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我向 MappingJackson2HttpMessageConverter 添加了 application/x-json 和 iso8859-1 支持,它可以很好地工作。这是一种解决方法,但我想知道为什么响应内容类型是 application/x-json;charset=iso-8859-1?我的控制器中有生产配置
@RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = "application/json;charset=UTF-8")
Run Code Online (Sandbox Code Playgroud)
有人知道如何配置它并让响应使用“application/json;charset=UTF-8”内容类型吗?
下面是我的测试方法
@Autowired
protected TestRestTemplate restTemplate;
@Test
public void testGetPerformanceObligationById() {
PerformanceObligationEntity entity = restTemplate.getForObject("/performance-obligations/{id}", PerformanceObligationEntity.class, "InvalidId");
Assert.assertNull(entity.getId());
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个过滤器
@TestConfiguration
static class Config {
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
final CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
}
Run Code Online (Sandbox Code Playgroud)
还将转换器修改为
@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"))));
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我得到了 application/x-json;charset=utf-8,所以只需保留如何从 application/x-json 到 application/json 配置
| 归档时间: |
|
| 查看次数: |
2964 次 |
| 最近记录: |