VO中沒有Getter和Setter方法導致HttpMessageConverter異常

 先貼問題基本代碼:

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方法

未完待續

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章