AngularJS向Spring Boot RestController传递JSON数据失效问题求助
AngularJS+Spring Boot JSON参数传递空值问题修复方案
核心问题定位
- 最初使用
@RequestParam接收JSON参数属于用法错误:@RequestParam仅用于获取URL查询参数、Form表单参数,JSON请求体数据必须搭配@RequestBody注解接收,这也是你最开始报MissingServletRequestParameterException的直接原因。 - 调整为
@RequestBody后依然拿不到值的核心原因是前端请求多套了一层对象包装:你修改后的Service代码里写的data: {medicoRicercato}是ES6对象简写语法,实际传到后端的JSON结构如下:
{ "medicoRicercato": { "acctNo": "你输入的账号", "tradeComment": "你输入的备注" } }
而后端TradeAnnotationRequest类的属性是直接定义的acctNo和tradeComment,JSON结构不匹配,Jackson无法完成字段映射,自然所有属性都是null。
3. 你新增的jackson-databind属于冗余依赖,Spring Boot的spring-boot-starter-web已经默认集成了Jackson序列化组件,额外引入反而可能引发版本冲突。
具体修复步骤
- 修正前端请求参数,去掉多余的外层包装:
把AnnotationService.js里的请求配置改为:
service.postExample = function(medicoRicercato) { alert("Post Example Click Value is " + medicoRicercato.acctNo + " " + medicoRicercato.tradeComment); return $http({ url: CONSTANTS.postExample, contentType: "application/json;charset=UTF-8", method: "POST", data: medicoRicercato, // 直接传对象,不要套大括号 dataType: 'json' }); }
你最开始写的$http.post("/annotatetrade/postExample", annotationjson)本身写法是正确的,不需要额外调整为自定义配置的写法,也可以直接恢复最开始的调用方式。
- 简化后端接口配置,删除冗余规则:
// 直接用@PostMapping更简洁,不需要多余的重复配置 @PostMapping("/annotatetrade/postExample") public void postExample(@RequestBody TradeAnnotationRequest request){ System.out.println("Post Example account " + request.getAcctNo()); System.out.println("Post Example comment " + request.getTradeComment()); }
- 删除pom.xml中手动引入的
jackson-databind依赖,避免版本冲突。 - 验证:调整完成后打开浏览器F12开发者工具,切换到网络面板,查看该POST请求的Payload内容,确认JSON的顶层属性就是
acctNo和tradeComment,没有外层包装,后端即可正常拿到参数值。
内容的提问来源于stack exchange,提问作者Arul
相关产品推荐
相关产品推荐

