某天試用RestTemplate調試,瀏覽器直接提示:
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Dec 01 14:49:26 CST 2017
There was an unexpected error (type=Internal Server Error, status=500).
Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.util.LinkedMultiValueMap] and content type [application/x-www-form-urlencoded;charset=UTF-8]
查看後臺是RestTemplate模板異常:
org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.util.LinkedMultiValueMap]
and content type [application/x-www-form-urlencoded;charset=UTF-8]
異常提示已經很明顯了,原因是由於我的post方法使用了MultiValueMap<String, Object>來封裝參數,但是無法找到合適的類型轉換,仔細查看我的RestTemplate對象獲取方式是如下的:
public static RestTemplate getInstance(String charset) {
StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName(charset));
RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(m).build();
return restTemplate;
}
其實問題就出現在上面這段代碼上面,我使用了RestTemplateBuilder來創建RestTemplate對象,該方式只會爲restTemplate模板初始化一個HttpMessageConverter(注:StringHttpMessageConverter間接實現HttpMessageConverter接口)
再比較直接 new RestTemplate()創建對象的方式
找到原因所在,可以不使用RestTemplateBuilder創建對象來避免這個異常,爲此對getInstance方法改造成以下的形式:
public static RestTemplate getInstanceByCharset(String charset) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName(charset)));
return restTemplate;
}
後臺不再報錯,問題完美解決!