微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在使用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;
}
  上述内容如果有错误的,欢迎评论指正

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐