Java Bean验证&x2B;数据库访问+;断言
我对一种情况感到困惑。想象一个像班上人一样的人:Java Bean验证&x2B;数据库访问+;断言,java,dao,bean-validation,Java,Dao,Bean Validation,我对一种情况感到困惑。想象一个像班上人一样的人: @Entity class Person { @NotBlank(message="Some message") @Column(name="ssn", nullable=false, unique=true) String ssn; ... } 嗯,ssn必须是唯一的,我可以通过使用unique=true语句来做到这一点,但是为了向用户显示一些消息,断言会很好: @AssertTrue(message="SSN
@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
}
你们认为这是个好习惯吗?对我来说,这有点奇怪,因为通过向实体添加数据库访问,它似乎变得太复杂了
我考虑了另外两种可能性:
@Unique
ssnavaailable
的临时属性,该属性将由PersonService填充您应该做的是捕获抛出的唯一约束冲突异常,并抛出您自己的自定义异常或返回所需的正确消息。。。如果引发的异常与唯一约束冲突没有直接关系,则可以使用
e.getCause()
然后,如果它是唯一的约束冲突,则进行更改并返回正确的消息。尝试在域中进行思考。人员
是否负责检查其属性之一在所有人员
中是否唯一?不,它不是,它不应该拥有这样做的能力
这就是服务的典型用途。运行查询以搜索具有特定SSN
的人是完全有效的。在PersonService
中,签名可以是这样的:
public boolean isSsnPresent(String ssn)
如果要在尝试将此人保存到数据库之前检查是否存在SSN
,则唯一约束对您没有帮助 哇。不要以纯文本形式存储SSN。请先使用安全的单向散列算法对其进行散列。您从验证中得到的消息是否不令人满意?@flakes这只是一个示例。它可能是调色板中的颜色代码,也可能是字典中的单词。@psi_uu明白了!安全总比后悔好!:)@Makoto正如我对Ogbe说的,我有一个表单,我想把友好的消息指向输入,就像它是空白的一样。我还没有尝试过这个。我有一个表单,我想把消息指向ssn输入,例如,就像它是空的一样。是的!这就是我所想的,因为认为一个对象可以“验证自身”似乎很奇怪,而这正是我试图做的:在试图保存它之前,检查是否已经有一个具有ssn的对象。太好了。但不要误解:“自我验证”是允许你的实体(人)做的事情,只要它与自身有关。例如,如果Person类中有类似updateMail()的方法,则可以检查电子邮件的语法是否正确,以保持Person处于有效和一致的状态。这里我不想说得太远,有几种方法,流行语:贫血和富领域模型。读起来很有趣。