java - JPA 实体验证

标签 java validation jpa jakarta-ee orm

好的,我正在尝试在 Java EE 容器中设置应用程序。我将 JPA 用于持久性,并且还使用 javax.validation.constraints.* 约束。默认情况下,容器在 @PrePersist@PreUpdate 生命周期事件期间验证实体,这对我来说很好,但我如何处理 ConstraintViolationException

我找不到关于它的任何文档,欢迎任何建议。

最佳答案

好吧,你可以捕获它:)这是一个例子(来自单元测试):

public class CustomerTest {
    private static EntityManagerFactory emf;
    private EntityManager em;

    @BeforeClass
    public static void createEntityManagerFactory() {
        emf = Persistence.createEntityManagerFactory("MyPu");
    }

    @AfterClass
    public static void closeEntityManagerFactory() {
        emf.close();
    }

    @Before
    public void beginTransaction() {
        em = emf.createEntityManager();
        em.getTransaction().begin();
    }

    @After
    public void rollbackTransaction() {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
        if (em.isOpen()) {
            em.close();
        }
    }

    @Test
    public void nameTooShort() {
        try {
            Customer customer = new Customer("Bo");
            em.persist(customer);
            em.flush();
            fail("Expected ConstraintViolationException wasn't thrown.");
        } catch (ConstraintViolationException e) {
            assertEquals(1, e.getConstraintViolations().size());
            ConstraintViolation<?> violation = e.getConstraintViolations().iterator().next();

            assertEquals("name", violation.getPropertyPath().toString());
            assertEquals(Size.class, violation.getConstraintDescriptor().getAnnotation().annotationType());
        }
    }
}

我的客户长什么样:

@Entity
public class Customer {
    @Id @GeneratedValue
    @NotNull
    private Long id;

    @NotNull
    @Size(min = 3, max = 80)
    private String name;

    private boolean archived;

    ...
}

但这只是展示 API 一小部分的示例。

在我看来,您实际上应该在 View 级别处理验证。许多表示框架都支持 Bean Validation:JSF 2.0、Wicket、Spring MVC...

另见

关于java - JPA 实体验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3323111/

相关文章:

java - 在JPA中插入1对n关系的 "other side"中的值(使用EclipseLink)

找不到类型的 java.util.Date bean

java - 如何在通过 curl 命令发送文件时在 Tomcat 服务器中的过滤器期间获取文件名

validation - 使用 Laravel 4、Factory Muff、Ardent、Faker 的 TDD - 我做错了

javascript - TDD 和参数验证 Javascript

java - 使用 JPA 检索 Box 内的所有项目

java - 将 ElementCollection 转换为一对多关系

java - Jackson - 在序列化为 json 期间将空集合视为 null

java - 为 XYAreaChart 设置 "auto"范围

symfony - 表格类型 : required attribute doesn't work with Entity Type