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
相关产品推荐
相关产品推荐

