探索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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM