探索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 }
posted @ 2019-03-26 14:31  光何  阅读(10676)  评论(0编辑  收藏  举报