使用Hibernate进行Spring Bean验证:验证不会在更新时发生

时间:2014-03-07 20:38:16

标签: spring hibernate validation bean-validation hibernate-validator

我的课程定义如下:

import org.hibernate.validator.constraints.NotBlank;

public class Game {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    @Column(name = "id")
    Long id;

    @NotBlank
    @Column(name = "title")
    String title;
    ...

但是,当我执行以下测试时,不会抛出任何验证异常:

@Test(expected = ConstraintViolationException.class)
public void thatExistingGameGivenBlankTitleCannotBeSaved(){
    Game game = new Game("SimCity 2000");
    gameDAO.save(game);
    game.setTitle(" "); //game.setTitle(null) doesn't work either
    gameDAO.save(game);
}

如何在保存已经存在的对象时创建验证器触发器?最好通过Java配置。

我的验证依赖项:

<!-- validation -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.0.Final</version>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.4</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-cdi</artifactId>
    <version>5.1.0.Final</version>
</dependency>

1 个答案:

答案 0 :(得分:1)

您的JPA实现必须集成bean验证。如果你正在使用Hibernate,这将通过将验证提供程序放在类路径中自动发生。如果没有阅读10.1.3. JPA。鉴于你的标签,我假设你正在使用JPA / Hibernate,它应该可以工作。

我不知道你的JPA实现正在调用gameDAO.save()。 Hibernate的集成是event based。如果您的save()不是这些事件,则默认情况下不会进行验证:

  • PreInsertEvent
  • PreUpdateEvent
  • PreDeleteEvent