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

QueryDSL报错eq(null) is not allowed 会员更新接口500错误排查

问题根因定位

报错是memberDto.getId()返回null导致QueryDSL的eq方法传入空值触发校验错误,核心问题有两个:

  • Controller接口的MemberDto参数没有加@RequestBody注解,Spring MVC默认不会将请求体的JSON数据绑定到参数对象,导致memberDto所有属性全为null
  • 前端传递的手机号字段名是phonenumber(全小写),和DTO中定义的phoneNumber(驼峰命名,N大写)不匹配,就算参数绑定正常,手机号字段也会注入失败

修复步骤

1. 修正Controller代码,添加@RequestBody注解

@PutMapping("/update")
@PreAuthorize("hasRole('USER')")
public ResponseEntity<?> userUpdate(@RequestBody MemberDto memberDto){
    memberService.userUpdate(memberDto);
    return new ResponseEntity<>("ok", HttpStatus.OK);
}

注:这里把冗余的@RequestMapping合并到了@PutMapping中,避免路径映射冲突

2. 统一前后端字段命名(二选一即可)

  • 方案A:修改前端请求的JSON字段,把phonenumber改成phoneNumber,符合Java驼峰命名规范
  • 方案B:在DTO的phoneNumber属性上添加@JsonProperty("phonenumber")注解,适配前端传入的小写字段
@Data
@NoArgsConstructor
public class MemberDto {
    private Long id;
    private String email;
    private String password;
    private String name;
    @JsonProperty("phonenumber")
    private String phoneNumber;
    // 其余构造方法保持不变
}

3. 可选优化:新增空值校验逻辑,避免非法请求报错

在Repository的更新方法前增加ID非空判断,提前抛出友好的业务异常:

@Override
public void updateMember(MemberDto memberDto){
    if (memberDto == null || memberDto.getId() == null) {
        throw new IllegalArgumentException("会员ID不能为空");
    }
    QMember qMember = QMember.member;
    queryFactory.update(qMember)
            .where(qMember.id.eq(memberDto.getId()))
            .set(qMember.email, memberDto.getEmail())
            .set(qMember.password, memberDto.getPassword())
            .set(qMember.name, memberDto.getName())
            .set(qMember.phoneNumber, memberDto.getPhoneNumber())
            .execute();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:18:03