【问题标题】:@Transient attribute that generate a ConstraintViolationException生成 ConstraintViolationException 的 @Transient 属性
【发布时间】:2019-09-17 20:32:07
【问题描述】:

这是我的课

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Email
    @NotEmpty
    private String email;

    @NotEmpty
    private String password;

    @Transient
    @NotEmpty
    private String passwordConfirmation;
    //constructors, getters, setters omitted....
   }

如您所见,passwordConfirmation 是瞬态的,不会存在于等效表中。

我有一个 UserRepository 可以从数据库中保存和检索用户。

public interface UserRepository extends JpaRepository<MyUser, Long> {}

当我保存用户时

User user1 = new User("zak@gmail.com", "pass", "pass");
userRepository.save(user1);

一切正常,但是当我检索用户进行某些处理时,我得到一个javax.validation.ConstraintViolationException: Validation failed for classes

  User user1 = userRepository.findByUsername("zak@gmail.com");
  //some procesing
  userRepository.save(user1);

当我检索用户时,passwordConfirmation 得到一个空值,因此我得到了这个异常。

什么可能是我的方案的好解决方案。 我应该重置密码确认值吗?

【问题讨论】:

  • “什么是好的解决方案?” 删除@NotEmpty,因为这是开始违反的约束。我很困惑你甚至问。你从不在乎它是否是空的。如果验证 UI,你关心它是否与 password 相同,否则你根本不关心。实际上,该字段不应该存在,因为双密码输入是为了防止拼写错误,应该在网络浏览器中检查,而不是在服务器上检查。

标签: java spring-data-jpa bean-validation


【解决方案1】:

passwordConfirmation 被标记为@NotEmpty,因此您正在执行获取操作,但未从数据库中检索任何值,然后保存您设置的@NotEmpty 约束失败的记录。删除约束或将其设置为一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2012-05-23
    • 2015-01-04
    • 1970-01-01
    • 2011-02-26
    • 2011-08-08
    相关资源
    最近更新 更多