Bean 验证 + 数据库访问 + 断言

Bean Validation + Database Access + Assertion

我对一种情况感到困惑。想象一个 class 像 Person:

@Entity
class Person {
    @NotBlank(message="Some message")
    @Column(name="ssn", nullable=false, unique=true)
    String ssn;
    ...
}

嗯,ssn 必须是唯一的,我可以使用 unique=true 语句来做到这一点,但是为了向用户显示一些消息,断言会很好:

@AssertTrue(message="SSN is already in use.")
public boolean isSsnAvailable() {
    // database query
}

你们认为这是一个好习惯吗?对我来说有点奇怪,因为通过添加数据库访问实体似乎变得太复杂了。

我想到了另外两种可能性:

  1. 创建一个带有注释的自定义验证器,如 @Unique
  2. 创建一个名为 ssnAvailable 的临时属性,它将由 PersonService 填充。

你应该做的是捕获抛出的违反唯一约束的异常并抛出你自己的自定义异常或return你想要的正确消息......如果抛出的异常与唯一约束没有直接关系违反约束,您可以使用

获取原因异常
e.getCause()

然后更改,如果它是唯一约束违规并且 return 正确的消息。

尝试在领域中思考Person 是否负责检查其属性之一是否在所有 Persons 中是唯一的?不,它不是,它也不应该具备这样做的能力。

这就是 Service 通常的用途。它对于 运行 搜索具有特定 SSN 的人的查询是完全有效的。在 PersonService 中,签名可能如下所示:

 public boolean isSsnPresent(String ssn)

如果您想在 尝试将 Person 保存到数据库之前检查 SSN 是否存在 ,则唯一约束对您没有帮助。