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

Spring Boot用户注册校验时抛出NotReadablePropertyException如何解决?

异常触发原因
  • 你怀疑的@Transient注解不会直接触发该异常:@Transient是JPA专属注解,仅作用于ORM实体和数据库的映射逻辑,完全不影响Spring反射读取JavaBean属性的逻辑。
  • 核心问题为Spring校验逻辑读取RegistrationRequest类属性失败:异常明确提示目标类是com.rmit.sept.bk_loginservices.payload.RegistrationRequest,你之前校验的是User类的getter方法,属于检查对象错误。
  • 常见触发场景有三类:
    1. RegistrationRequest类的confirmPassword字段的getter方法不符合JavaBean规范:方法名未严格遵循getConfirmPassword()驼峰命名规则、访问权限不是public、返回值类型和字段不匹配
    2. 自定义密码一致性校验注解的配置错误:校验注解中指定的二次密码字段名拼写错误,和RegistrationRequest类的实际字段名不匹配
    3. 如果你用Lombok自动生成getter,confirmPassword字段可能被手动标注了@Getter(AccessLevel.NONE)等注解,屏蔽了自动生成逻辑,导致没有公开getter方法
解决方案
  • 第一步:修正校验对象,检查RegistrationRequest类的confirmPassword相关方法
    确保字段存在、getter方法为public、方法名为getConfirmPassword(),如果手动写了setter也要保证入参类型和字段一致。如果用Lombok,删除该字段上屏蔽getter生成的注解,或者手动补全public的getter方法。
  • 第二步:检查自定义密码校验注解的配置
    找到你标注在RegistrationRequest类上的密码一致性校验注解,确认second/matchTo这类指定二次密码字段的配置值,和实际字段名confirmPassword完全一致,大小写无偏差。
  • 第三步:验证属性读取逻辑(可选)
    可以通过以下测试代码快速验证属性是否可正常读取:
    RegistrationRequest request = new RegistrationRequest();
    request.setConfirmPassword("testPwd");
    BeanWrapper beanWrapper = new BeanWrapperImpl(request);
    // 正常情况会输出testPwd,抛出异常则说明getter确实存在问题
    System.out.println(beanWrapper.getPropertyValue("confirmPassword"));
    
  • 第四步:清理冗余注解
    确认@Transient仅标注在User实体类的confirmPassword字段上,不要给RegistrationRequest请求类的字段加任何JPA相关注解,避免不必要的干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:15:04