【问题标题】:Spring Hibernate validator issue about model add and update method关于模型添加和更新方法的 Spring Hibernate 验证器问题
【发布时间】:2014-11-25 15:49:14
【问题描述】:

我在 Spring 中使用过 Hibernate 验证器,我需要像这样检查模型“Admin”:

@NotEmpty
@Size(min = 4, max = 40)
private String password;

当我保存“admin”时需要密码,我使用了“@Valid @ModelAttribute Admin admin”。 所以保存前会检查。

但是当我更新admin时,如果用户没有提供密码,我们认为他不想更改密码,所以密码的空值是合法的,对于这种情况,我们不能不再使用“@Valid @ModelAttribute Admin admin”,因为密码属性已经被@NotEmpty注解,所以对于这种情况,我们的做法是自己在代码中手动完成,我想有没有更好的方法来解决?我们仍然想使用 Bean Validation 功能。

还有另一个问题:

@NotEmpty
@Size(min = 2, max = 20)
private String username;

我们保存用户名的时候,一定要检查用户名是否存在,也就是说我们需要检查DB,这种情况如果还是用bean验证怎么解决,定义了一个
类级别的注释?

我希望有人可以帮助我。谢谢

【问题讨论】:

  • 不要在 Web 层中使用域对象。为每个用例使用特定对象,即。 CreateAdminCommand 带有那些没用的属性和验证。和UpdateAdminCommand/UpdateAdminRequest(或任何你喜欢的)以及该用例的属性和验证。给您在您的域中的意图,并且您可以使用服务方法来处理这些不同的用例。唯一的缺点是您需要复制一些数据,优点是清晰并且可以保护您的域。
  • 我个人不喜欢需要复制数据并且不得不维护这个额外的层 - 闻起来很旧。对于像empty or when present values must bear certain rules 这样的简单验证规则来说,这太过分了。
  • @RockyHu 你在用 Spring 吗?
  • @bhantol 是的,我用的是弹簧
  • 检查我的解决方案...它需要 Spring。

标签: java spring spring-mvc hibernate-validator


【解决方案1】:

您可以使用groups。例如,您的模型将是:

@NotEmpty(groups = CreateAdmin.class)
@Size(min = 4, max = 40)
private String password;

创建管理员组。

public interface CreateAdmin {
}

在您的 Spring 控制器中,使用 Spring 的 @Validated 而不是 @Valid

管理员创建方法:

@Validated(value = CreateAdmin.class) @ModelAttribute Admin admin

并在更新方法中使用默认组:

@Validated @ModelAttribute Admin admin

现在,@NotEmpty 仅在创建管理员时适用。

对于您的第二个问题you can create a custom constraint,例如@UniqueUsername,并在约束验证器的isValid 方法中检查数据库。

【讨论】:

    【解决方案2】:

    我们使用了SpelAssert from jirutka,但是也可以使用@Pattern处理这种边缘情况

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 2017-05-14
      • 1970-01-01
      • 2011-04-03
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多