Spring Bean Validation与Hibernate:更新时验证未发生

3

我有一个定义如下的类:

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>

验证通常(并且应该)在命令 bean 上完成。 - Tiny
谢谢,您能指导我如何做这个并提供相关文档吗? - Carlos Daniel Gadea Omelchenko
123以及这个是一个基本的完整示例。 - Tiny
回答这个问题的内容涉及到很多关于验证的信息。 - Tiny
@Api 表示:验证被注释的字符串不为 null 或空。与 NotEmpty 的区别在于尾随空格将被忽略。 - Markus Malkusch
显示剩余4条评论
1个回答

1
您的JPA实现必须集成bean验证。如果您使用Hibernate,只需将验证提供程序放在类路径中即可自动完成此操作。否则,请参阅10.1.3. JPA。鉴于您的标签,我假设您正在使用JPA / Hibernate,并且它应该起作用。
我不知道gameDAO.save()在您的JPA实现上调用了什么。Hibernate的集成是基于事件的event based。如果您的save()不是这些事件中的任何一个,则默认情况下不会进行验证:
  • PreInsertEvent
  • PreUpdateEvent
  • PreDeleteEvent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接