先貼問題基本代碼:
public class FieldMap{
String name;
HashMap<String, List<User>> userMap;
public FieldMap() {
name ="StringField";
userMap = new HashMap<>();
List<User> list = new ArrayList<>();
User user = new User();
user.setName("young");
userMap.put(user.getName(), list);
}
}
@RequestMapping(value = "fieldMap")
@ResponseBody
public FieldMap fieldMap(HttpServletRequest request, HttpServletResponse response) {
FieldMap fieldMap = new FieldMap();
return fieldMap;
}
猿Why今天遇到這樣一個問題(剝離業務場景):接口返回的自定義類型(FieldMap),有Map類型的Field。由於搭建項目框架的同學重新了方法org.springframework.web.servlet.config.annotation.WebMvcConfigurer#configureMessageConverters,對於類型進行了限制。於是出現了“No converter found for return value of type: XXXXXX”
首先想到,是不是搭建項目骨架的同學重寫了configureMessageConverters
org.springframework.web.servlet.config.annotation.WebMvcConfigurer#configureMessageConverters
不支持對象中Map Field。因爲實際調試,情況是這樣的:
OK,作爲排查手段,補充 HttpMessageConverter:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
converter.setFastJsonConfig(config);
converter.setDefaultCharset(Charset.forName("UTF-8"));
converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));
converters.add(converter);
converters.add(new StringHttpMessageConverter());
}
再次測試:
依然不是期望值,data中沒有東西。不過好在沒有異常信息了。
嘗試搜索了一些關鍵字“HttpMessageConverter” “自定義”,姿勢不對,沒有獲得有效解決辦法,那麼就接着調試唄!
難搞哦!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
從這開始body中的data就變空了,調試跟蹤不到是哪裏變得,很難受!
{
"code": 200,
"data": {},
"message": "SUCCESS"
}
靈光一閃,做了如下變動
public class FieldMap{
String name;
HashMap<String, List<User>> userMap;
public FieldMap() {
name ="StringField";
userMap = new HashMap<>();
List<User> list = new ArrayList<>();
User user = new User();
user.setName("young");
userMap.put(user.getName(), list);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HashMap<String, List<User>> getUserMap() {
return userMap;
}
public void setUserMap(HashMap<String, List<User>> userMap) {
this.userMap = userMap;
}
}
{
"code": 200,
"message": "SUCCESS",
"data": {
"name": "StringField",
"userMap": {
"young": []
}
}
}
Done!!!!!!!!!!!!!!!!很想知道爲什麼會這樣?
先拿到兩個經驗值:
1:針對VO中有Map等類型Field,可能需要自定義
2:FastJsonHttpMessageConverter會用到VO中的Getter和Setter方法
未完待續