调用Update API未传DOB字段触发非空错误及多@RequestBody合并问题
问题解答
问题1:更新接口未传DOB字段触发非空错误
问题原因
你的更新逻辑里,直接把传入的orgPatient的dob值赋值给了从数据库查到的updatedUser:
updatedUser.setDob(orgPatient.getDob());
当请求体没传DOB时,orgPatient.getDob()返回null,覆盖掉了updatedUser原本的非空DOB值,保存时触发数据库的NOT NULL约束,导致抛出SQLIntegrityConstraintViolationException。
解决方案
修改更新逻辑,只对传入的非空字段赋值,保留数据库里原有的字段值:
// 仅在传入的firstName不为空时更新 if (orgPatient.getFirstName() != null) { updatedUser.setFirstName(orgPatient.getFirstName()); } // 中间名同理处理 if (orgPatient.getMiddleName() != null) { updatedUser.setMiddleName(orgPatient.getMiddleName()); } // 姓氏同理处理 if (orgPatient.getLastName() != null) { updatedUser.setLastName(orgPatient.getLastName()); } // DOB仅在传入值非空时更新,否则保留原有值 if (orgPatient.getDob() != null) { updatedUser.setDob(orgPatient.getDob()); } // 性别同理处理 if (orgPatient.getGender() != null) { updatedUser.setGender(orgPatient.getGender()); }
这样就算请求体没传DOB,也不会覆盖数据库里已有的非空值,避免触发约束错误。
问题2:合并两个@RequestBody参数为单个请求体
问题原因
Spring MVC规定一个HTTP请求只能有一个@RequestBody参数,没法同时接收两个标注了@RequestBody的对象,所以需要把两个对象封装到一个DTO(数据传输对象)里。
解决方案
- 创建合并后的DTO类:
public class PatientUpdateDTO { private OrgPatient orgPatient; private PatientContact patientContact; // 生成getter和setter方法 public OrgPatient getOrgPatient() { return orgPatient; } public void setOrgPatient(OrgPatient orgPatient) { this.orgPatient = orgPatient; } public PatientContact getPatientContact() { return patientContact; } public void setPatientContact(PatientContact patientContact) { this.patientContact = patientContact; } }
- 修改Controller层,接收这个DTO参数:
@PutMapping(value="/update/{PatientId}") public ResponseEntity<String> updateOrg(@PathVariable String PatientId, @RequestBody PatientUpdateDTO updateDTO) { String ans = updateOrgPatientService.updateOrgColumn(PatientId, updateDTO.getOrgPatient(), updateDTO.getPatientContact()); return ResponseEntity.ok(ans); }
- Postman请求体改用JSON嵌套结构:
{ "orgPatient": { "firstName": "张三", "lastName": "三" // 其他需要更新的OrgPatient字段 }, "patientContact": { "contactNumberType": "mobile", "contactNumer": "138xxxx1234" // 其他需要更新的PatientContact字段 } }
内容的提问来源于stack exchange,提问作者dracile
相关产品推荐
相关产品推荐

