Spring Boot JDBC新增数据异常:RequestBody未绑定+BadSqlGrammarException
解决Spring Boot JDBC新增数据时的两个问题:@RequestBody参数接收失败与SQL语法错误
一、@RequestBody无法获取JSON参数的原因及解决
- 请求体JSON的键采用大写蛇形命名(如
FROM_VALUES),但Java实体类DisputeLog的属性通常为小驼峰命名(如fromValues),Jackson默认无法自动完成映射,导致所有属性值为null。 - 两种解决方式任选其一:
- 修改请求体JSON的键为小驼峰格式:
{ "fromValues": "Y", "toValues": "Z", "source": "ES", "disputeID": "5567", "createdBy": "AB5W1" } - 在
DisputeLog实体类的对应字段上添加@JsonProperty注解,指定JSON键名:public class DisputeLog { @JsonProperty("FROM_VALUES") private String fromValues; @JsonProperty("TO_VALUES") private String toValues; @JsonProperty("SOURCE") private String source; @JsonProperty("DISPUTE_ID") private String disputeID; @JsonProperty("CREATED_BY") private String createdBy; // 其他字段、getter/setter方法 }
- 修改请求体JSON的键为小驼峰格式:
二、BadSqlGrammarException的原因及解决
- 当前采用字符串拼接SQL的方式,不仅存在SQL注入风险,还会在参数为
null时拼接出字符串'null'(而非SQL标准的NULL值),触发DB2的语法错误;同时这种写法也可能导致JDBC底层处理时出现参数索引越界异常。 - 解决方法:使用参数化查询,调用
JdbcTemplate的带参数重载方法执行SQL:
修改服务层代码如下:public DisputeLog addNewDisputeLog(DisputeLog disputeLog){ disputeLog.setCreatedAt(new Timestamp(System.currentTimeMillis())); String query = "INSERT INTO ENGAGE_AR_DISPUTES.DISPUTE_LOGS(FROM_VALUES, TO_VALUES, SOURCE, DISPUTE_ID, CREATED_BY) VALUES (?, ?, ?, ?, ?)"; jdbcTemplate.update(query, disputeLog.getFromValues(), disputeLog.getToValues(), disputeLog.getSource(), disputeLog.getDisputeID(), disputeLog.getCreatedBy() ); return disputeLog; } - 参数化查询的优势:
- 自动处理
null值,插入SQL标准的NULL而非字符串'null' - 彻底避免SQL注入风险
- 解决JDBC参数索引越界问题
- 自动处理
内容的提问来源于stack exchange,提问作者Pao Beltran
相关产品推荐
相关产品推荐

