Spring Boot用户注册校验时抛出NotReadablePropertyException如何解决?
异常触发原因
- 你怀疑的
@Transient注解不会直接触发该异常:@Transient是JPA专属注解,仅作用于ORM实体和数据库的映射逻辑,完全不影响Spring反射读取JavaBean属性的逻辑。 - 核心问题为Spring校验逻辑读取
RegistrationRequest类属性失败:异常明确提示目标类是com.rmit.sept.bk_loginservices.payload.RegistrationRequest,你之前校验的是User类的getter方法,属于检查对象错误。 - 常见触发场景有三类:
RegistrationRequest类的confirmPassword字段的getter方法不符合JavaBean规范:方法名未严格遵循getConfirmPassword()驼峰命名规则、访问权限不是public、返回值类型和字段不匹配- 自定义密码一致性校验注解的配置错误:校验注解中指定的二次密码字段名拼写错误,和
RegistrationRequest类的实际字段名不匹配 - 如果你用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
相关产品推荐
相关产品推荐

