在使用axios向SpringBoot后端传参时遇到的一个问题

问题

报错如下:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.ArrayList<×××>` from Object value (token `JsonToken.START_OBJECT`); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<×××>` from Object value (token `JsonToken.START_OBJECT`)<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 1]]

翻译一下,大意是:JSON解析错误:无法从对象值(token JsonToken.START_OBJECT)反序列化“java.util.ArrayList<×××>”类型的值;嵌套异常为com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从对象值反序列化“java.util.ArrayList<×××>”类型的值(token JsonToken.START_OBJECT)<EOL>,位于[源:(org.springframework.util.StreamUtils$nonclosingputstream);第1行,第1列]

简单来说大概就是JSON字符串解析错误

解决方法

开门见山,我的这个问题是由于JSON的key-value没有和后端由@RequestBody所注解的变量类型一一对应所导致的。所以只要将它们对应起来,问题就解决了。

首先,前端axios的post请求为:

this.$axios.post(`/test`,
{
   schools: this.tableData
}).then((response) => {
 console.log(response)
})

axios传到后端的JSON字符串为:

{
   schools : [
       SchoolVo(
           schoolId=1,
           schoolName="测试",
           schoolSpecialities=1,
           schoolTeachers=3,
           schoolCourses=15
      ),
       SchoolVo(
           schoolId=2,
           schoolName="测试2",
           choolSpecialities=0,
           schoolTeachers=1,
           schoolCourses=1
      )
  ]
}

原来后端的方法是:

@PostMapping("/test")
public boolean test(@RequestBody List<SchoolVo> schools) {
   // ...
   return false;
}

把方法修改成下面这样就对了。请注意,两者的不同是就上面的List<SchoolVo> schools改为了Map<String, List<SchoolVo>>

@PostMapping("/test")
public boolean test(@RequestBody Map<String, List<SchoolVo>> abc) {
   List<SchoolVo> schools = abc.get("schools");
   // ...
   return false;
}
 
上述内容如果有错误的,欢迎评论指正
posted @ 2022-06-09 12:12  水煮酸菜鱼  阅读(6161)  评论(0编辑  收藏  举报