如何验证某些持久性操作,而不是其他操作

时间:2015-07-30 17:18:28

标签: spring validation jpa spring-boot

我已经要求说明用户可以保存'一个foo根本没有验证,但如果他们提交了#39;那么必须验证对象。我已经在Parsley.js的前端构建并使用了这个,但是想要添加后端验证。

使用Spring / Boot执行此操作的典型方法是什么?我理解基本的JPA验证,但我不知道如何有条件地应用它。

我还想提一下,我试图用Foo的两个子类来做这件事,但是我无法管理切换类型,要么是因为它在Java中不可能,要么是因为我不了解如何实例化该对象的新版本,并期望它为.equals()旧版本的Hibernate持久性。

感谢您的任何见解。

2 个答案:

答案 0 :(得分:1)

  1. 使用JSR 303 Validation Groups。这为您提供了条件验证。

  2. 在处理程序方法中使用Spring @Validated。这使您可以在控制器中应用不同的验证

  3. 按照我的示例:http://blog.databasepatterns.com/2014/06/draft-entities-hibernate-validator.html

答案 1 :(得分:0)

JPA不可能进行条件验证。

为什么呢?因为许多验证只是JPA未验证的数据库约束,而是数据库无条件验证。

例如

@NotNull
private Integer value;

将创建一个NOT NULL约束的列。

或者

@Size(max = 100)
private String value;

将创建一列VARCHAR(100)

正如您可能理解的那样,无法将值保存到打破大小约束且超过100个字符的列中。

确实 - 切换 Java中的对象类型是不可能的。

您可以将Entity1转换为Entity2,但这只是编译器的变量。对象本身是Entity1 - 无论你尝试什么。但您可以将<{1}}的实例中的所有值复制Entity1的新实例:

Entity2

如果您不想手动复制所有属性,可以使用Apache BeanUtils中的Entity1 entity1 = ... Entity2 entity2 = new Entity2(); entity2.setProperty(entity1.getProperty()); ... entityManager.persist(entity2); entityManager.delete(entity1);