【问题标题】:How to use Spring Validation Annotation in DAO concurrently(Bean Validation Specification)如何在DAO中同时使用Spring Validation Annotation(Bean Validation Specification)
【发布时间】:2017-01-09 13:30:10
【问题描述】:

我有一个用户实体,它使用 Spring Validation Annotation[Edited - Bean Validation Specification],如下所示。

@NotEmpty(message = "{warn.null.user.password}")
private String            password;

当我用于注册操作时,此验证是可以的,但我尝试通过名为 Update 的不同操作使用相同的实体(用户),我想取消 @NotEmpty 注释。我该怎么做?

问候。

【问题讨论】:

  • 为什么人们不赞成并试图结束这个问题?
  • 傲慢的男人!你的回答很丰富。

标签: java spring spring-boot bean-validation


【解决方案1】:

我有一个用户实体,它使用 Spring Validation Annotation 如下。

首先,它不是“Spring Validation Annotation”。这些是来自Bean Validation Specification(称为JSR-303 和JSR-349)的注释。一些注释是非标准的,由验证提供者提供(例如,Hibernate Validator)。

但我尝试通过名为 Update 的不同操作使用相同的实体(用户),我想取消 @NotEmpty 注释

可以通过注解的groups属性来实现。在第一种情况下,您将运行所有组,而在另一种情况下,您将运行其中的一些组。不幸的是,规范(当前)不支持这一点(因为@Valid 不允许提供groups)。

这就是 Spring 的非标准注解 @Validated 的用武之地:您可以使用它指定验证组!

但它仅适用于控制器中的验证模型。在将实体持久化到数据库之前,它不能作为验证,因为无法指定组(始终使用Default 组)。

举个例子,你可以用这个问题:Hibernate-validator Groups with Spring MVC

【讨论】:

  • @SalvaSemushin ,非常有用,感谢您指出我对验证名称的错误理解。你帮了我。 (^^
【解决方案2】:

您可以从域模型中的用户实体中删除验证并将其移至服务层。这更有意义,因为实体的验证取决于上下文。

在您的示例中,有 2 个用例:

  • 用户应该能够注册

  • 用户应该能够更改他的数据,例如他的密码。

然后可以像下面的代码那样建模。

 public class User {

        private final String email;
        private String password;

        public User(final String email, final String password) {

            this.email = email;
            this.password = password;
        }

        public void changePassword(final String password) {
            this.password = password;
        }

        public String getEmail() {
            return email;
        }

        public String getPassword() {
            return password;
        }

    }

这还有一个好处是您的域模型不依赖于外部库。

您可以将验证从域层移动到服务层,其中验证取决于所执行的操作。有注册命令和更新命令。

用户注册时,邮箱和密码不能为空。

public class RegisterUserCommand {

    @NotEmpty(message = "{warn.null.user.email}")
    private String email;
    @NotEmpty(message = "{warn.null.user.password}")
    private String password;
    ...

更新命令只要求邮箱不为空

public class UpdateUserCommand {

    @NotEmpty(message = "{warn.null.user.email}")
    private String email;
    private String password;
    ...

在服务层中,您可以执行以下操作:

public class UserService {

    private final UserDao userDao;

    public UserService(final UserDao userDao){
        this.userDao = userDao;
    }

    public User register(final RegisterUserCommand command) {
        User user = new User(command.getEmail(), command.getPassword());
        return userDao.save(user);
    }

    public User update(final UpdateUserCommand command) {
        User user = userDao.findUserByEmail(command.getEmail());
        user.changePassword(command.getPassword);
        return user;

    }

}

这当然只是一个例子,因为我不知道你的其余代码是如何实现的。

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2022-06-29
    • 2022-07-17
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多