Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bean验证&x2B;数据库访问+;断言_Java_Dao_Bean Validation - Fatal编程技术网

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处于有效和一致的状态。这里我不想说得太远,有几种方法,流行语:贫血和富领域模型。读起来很有趣。