1. cannot deserialize instance of java.util.arraylist<java.lang.object> out of start_object token
事实上,这个问题一般出在想偷懒完成以下映射的时候:
- 前端ajax通过post/put请求,在请求体json中塞入List列表如下:
{ids: ["id1",...,"idn"]}
- 后端controller图简便,不想声明一个对象来接收,而是想其自动拆包成
ids -- List<String>
使用:
@PutMapping
public Results updateEntity( @RequestBody List<String> ids) {
问题产生的原因在于,Jackson并不能像我们想的一样自动拆包json成为ids -- List<String>
,而是将该json对象处理为一个Map
,ids
作为key,List<String>
作为value。所以,要想通过传json的方式来接收,后端的RequestBody就必须是Map<>格式:
@PutMapping
public Results updateEntity( @RequestBody Map<String,List<String>> ids) {
当然,直接使用List<String>
也有办法,那就是避开传整个json字符串的方式,而是采用传List列表,即ajax请求改为如下格式:
$axios({
url: `/dish/status/${params.status}`,
method: 'put',
data: params.id //json则是:{ids: params.id}
})
还有一个类似的错误,显示是out of VALUE_NUMBER_INT token
,这是由于params.id
在只有一个成员时,并未处理为List,而是当成了字符串,后端映射时使用List<String>>
来转换就会报上述错误