首页 > Web开发 > 详细

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

时间:2019-03-26 15:15:19      阅读:593      评论:0      收藏:0      [点我收藏+]

  今天使用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对象,但仅限于第一层的对象,至于嵌套的对象,则需要开发者自己去转换。

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

原文:https://www.cnblogs.com/guanghe/p/10599952.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!