• 探索RequestBody报com.alibaba.fastjson.JSONObject cannot be cast to xxx


      今天使用RequestBody接受前端传过来的参数,以前接受字符串数组非常成功,这次把形参改成了List<User>,原本以为顺利接受参数并映射成User的list结构,结果竟然在我取user.getId()时报了com.alibaba.fastjson.JSONObject cannot be cast to xxx的错。

    前端:

     1 $.ajax({
     2     url : "/insertUser",
     3     async : true,
     4     cache : false,
     5     type : "post",
     6     contentType : "application/json; charset=UTF-8",
     7     data : JSON.stringify(userList),
     8     success : function(data) {
     9         //...
    10     }
    11 });

    后端:

    1 @RequestMapping("/insertUser")
    2 public void insertBlank(@RequestBody List<User> userList) {
    3     User user = userList.get(0);
    4     System.out.println(user.getId());
    5 }

      不知怎的,RequestBody接受参数不能直接转成想要的类,通过debug观察到userList接受到了一个JSONArray<JSONObject>的结构,根本没有转成List<User>.

      搜索资料,发现要想用RequestBody直接映射到java对象,需要配置在配置springMVC注解驱动时配置fastJson转换器,看了看项目中的配置文件,这的配了这个东西。

     1 <mvc:annotation-driven>
     2     <mvc:message-converters register-defaults="true">
     3         <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
     4             <property name="supportedMediaTypes">
     5                 <list>
     6                     <value>application/json;charset=UTF-8</value>
     7                 </list>
     8             </property>
     9         </bean>
    10     </mvc:message-converters>
    11 </mvc:annotation-driven>

      但是与资料不同,正在开发的项目还对这个转换器设置了支持触发的类型application/json;charset=UTF-8。

      观察一下

      发送的请求为application/json; charset=UTF-8,

      支持的类型为application/json;charset=UTF-8

      发现端倪了,我发的请求类型中间多了一个空格!

      去掉空格发送请求,结果:

      我的user对象还是没有转换成功,还是一个一个JSONObject,但是请观察,JSONArray转换成了ArrayList。

      嗯,配置的映射转换器生效了,结果表明,RequestBody能直接将json对象映射成java对象,但仅限于第一层的对象,至于嵌套的对象,则需要开发者自己去转换。

    1 @RequestMapping("/insertUser")
    2 public void insertUser(@RequestBody List<JSONObject> list) {
    3     List<User> userList = list.stream().map(json -> JSONObject.toJavaObject(json, User.class)).collect(Collectors.toList());
    4     service.insertUser(userList);
    5 }
  • 相关阅读:
    转载:对不起,我是程序员
    [VB6]支持UTF文本文件访问的模块 支持UTF8无BOM格式编码自动识别
    Do it. Do it right. Do it right now!
    TortoiseGit密钥的配置
    GIT服务器配置
    Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型
    Linux设备驱动程序学习(19)-USB 驱动程序(四)
    是什么浪费了我的上网时间?
    【转】处理wording的一些参考
    ElementUI学习之rules详解
  • 原文地址:https://www.cnblogs.com/guanghe/p/10599952.html
Copyright © 2020-2023  润新知