UI输入审批备注保存时approveRemarks传入null的技术问题求助
你遇到的UI输入审批备注后,approveRemarks参数传入为null的问题,可从以下几个方向排查并修复:
1. HTTP请求方法不匹配
当前控制器使用RequestMethod.GET处理保存操作,但GET请求通常用于查询数据,不适合提交表单内容(表单数据会放在URL中,长度受限且不安全)。若UI通过POST方式提交数据,控制器将无法获取参数。
修复:
将控制器的请求方法改为POST:
@RequestMapping(value = "/saveRiskRuleApproveNew", method = RequestMethod.POST, produces = "application/json")
同时确保UI端的表单或AJAX请求使用POST方法提交。
2. 参数名称不匹配
UI输入框的name属性必须与控制器参数名approveRemarks完全一致(大小写敏感)。若UI端使用了类似approveremarks或remark的名称,Spring将无法绑定参数值。
检查:
- HTML表单输入框:确认
name="approveRemarks" - AJAX请求:确认数据键名为
approveRemarks// 示例AJAX请求 $.ajax({ url: "/saveRiskRuleApproveNew", method: "POST", data: { status: "approve", ruleId: "xxx", approveRemarks: $("#remarksInput").val(), // 键名必须匹配 riskInstruction: "xxx" } });
3. 缺失@RequestParam注解
当前控制器仅给status添加了@RequestParam,其他参数未显式声明。Spring对未加注解的String参数默认视为可选,若参数未传入会直接赋值为null,且无错误提示。
修复:
给所有参数添加@RequestParam并设置required=true,强制校验参数是否存在:
public Map<String, String> saveRiskRuleApproveNew( @RequestParam(required = true) String status, @RequestParam(required = true) String ruleId, @RequestParam(required = true) String approveRemarks, @RequestParam(required = true) String riskInstruction, HttpSession session ) { // 原有逻辑 }
若参数未传入,Spring会直接返回400错误,快速定位问题根源。
4. 检查网络请求是否携带参数
通过浏览器开发者工具(F12 → 网络标签),执行保存操作后查看请求详情:
- POST请求:检查「表单数据」中是否存在
approveRemarks及对应值 - GET请求:检查URL查询参数中是否包含
approveRemarks
若参数未出现在请求中,说明UI端存在代码问题(如输入框未关联到表单、JS逻辑未正确获取输入值等)。
5. 修复SQL注入漏洞(附加优化)
当前DAO层使用字符串拼接生成SQL,存在严重的SQL注入风险,且若approveRemarks为null会将数据库字段设置为字符串'null'而非null值。
修复:
使用参数化查询替代字符串拼接:
// 以approve分支为例 Query updatequery = session.createNativeQuery( "UPDATE CBEC_GST.SCRTY_RISK_RULE SET APPROVAL_STATUS = :approvalStatus, APRV_REMARKS = :approveRemarks, RISK_RULE_INST = :riskInstruction, APPROVED_BY = :ssoId WHERE UI_RULE_ID = :ruleId" ); updatequery.setParameter("approvalStatus", "APPROVED"); updatequery.setParameter("approveRemarks", approveRemarks); updatequery.setParameter("riskInstruction", riskInstruction); updatequery.setParameter("ssoId", userBean.getSsoId()); updatequery.setParameter("ruleId", ruleId); updatequery.executeUpdate();
内容的提问来源于stack exchange,提问作者Nancy

