Spring Boot接收Axios POST请求时JSON反序列化失败致对象字段全为null
核心问题排查与修正
1. 匹配当前代码的核心故障点
- 前端Axios传参多嵌套了一层对象:你在代码里写的
axios.post('http://localhost:8080/word', {user}),本质是向请求体传入了外层为user键的嵌套结构,完整Payload实际为:
你抓包看到的平铺结构属于视觉误判(浏览器开发者工具展开嵌套对象时容易混淆层级)。Jackson做JSON反序列化时,只会从请求体的顶层找和{ "user": { "sentence": "hello", "word": "world" } }WordSearch类字段匹配的sentence、word键,现在顶层根本没有这两个键,自然无法给字段赋值,所有字段都是null。
修正方式:去掉传参时多余的对象包裹,直接把要传的user对象作为第二个参数传入:
修正后发出的Payload才是和Java实体类完全匹配的平铺结构,反序列化才能正常生效。// 错误写法 axios.post('http://localhost:8080/word', {user}) // 正确写法 axios.post('http://localhost:8080/word', user)
2. 其他配套排查点
- 确认请求头
Content-Type为application/json:你在Controller上配置了consumes = MediaType.APPLICATION_JSON_VALUE,如果Axios因为自定义配置没带这个请求头,后端会直接拒绝请求、匹配不上JSON解析器,最终拿到的参数全是null。Axios默认会自动给POST请求加这个头,只有手动修改请求头配置时容易出问题。 - 确认实体类存在无参构造方法:Jackson反序列化需要通过无参构造方法创建类实例,如果你在
WordSearch类里手动定义了带参构造方法,Java不会自动生成默认的无参构造,就会导致实例创建失败、字段全为null。当前你贴的代码里没有显式的带参构造,这个问题概率较低,可以快速排查确认。
快速验证方法
在Controller方法的第一行加一行打印日志,直接输出接收到的对象字段值,就能立刻定位是传参结构不对,还是反序列化逻辑有问题:
public long Search (@RequestBody WordSearch wordsearch) { // 打印实际接收到的字段内容 System.out.println("接收到的sentence值:" + wordsearch.getSentence() + ",word值:" + wordsearch.getWord()); count = wordsearch.search(); return count; }
内容的提问来源于stack exchange,提问作者anaweila
相关产品推荐
相关产品推荐

