You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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(数据传输对象)里。

解决方案

  1. 创建合并后的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;
    }
}
  1. 修改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);
}
  1. Postman请求体改用JSON嵌套结构:
{
    "orgPatient": {
        "firstName": "张三",
        "lastName": "三"
        // 其他需要更新的OrgPatient字段
    },
    "patientContact": {
        "contactNumberType": "mobile",
        "contactNumer": "138xxxx1234"
        // 其他需要更新的PatientContact字段
    }
}

内容的提问来源于stack exchange,提问作者dracile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:27:23