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

Spring 如何验证某些持久性操作,而不是其他操作,spring,validation,jpa,spring-boot,Spring,Validation,Jpa,Spring Boot,我有一个要求,即用户可以在根本没有验证的情况下“保存”一个foo,但如果他们“提交”,则必须验证对象。我已经用Parsley.js构建了所有这些,并在前端工作,但我想添加后端验证 使用Spring/Boot执行此操作的典型方法是什么?我理解基本的JPA验证,但我不知道如何有条件地应用它 我还想提到,我曾尝试使用Foo的两个子类来实现这一点,但我无法管理切换类型,这可能是因为在Java中不可能实现,也可能是因为我不理解如何实例化对象的新版本,并期望它.equals()作为Hibernate持久化的

我有一个要求,即用户可以在根本没有验证的情况下“保存”一个
foo
,但如果他们“提交”,则必须验证对象。我已经用Parsley.js构建了所有这些,并在前端工作,但我想添加后端验证

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

我还想提到,我曾尝试使用
Foo
的两个子类来实现这一点,但我无法管理切换类型,这可能是因为在Java中不可能实现,也可能是因为我不理解如何实例化对象的新版本,并期望它
.equals()
作为Hibernate持久化的旧版本


感谢您的帮助。

JPA不可能进行条件验证

为什么??因为许多验证只是数据库约束,JPA不会验证,但数据库会无条件地验证

例如a

@NotNull
private Integer value;
将创建一个具有
非空
约束的列

或者

将创建一列
VARCHAR(100)

正如您可能理解的那样,不可能将值保存到这样一个列中,该列会打破大小限制,并且包含100个以上的字符

事实上,在Java中切换对象的类型是不可能的

例如,您可以将
Entity1
强制转换为
Entity2
,但这只是编译器的变量。对象本身是一个
实体1
——无论您尝试什么。但您可以将所有值从
Entity1
的实例复制到
Entity2
的新实例:

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

  • 使用JSR303。这将为您提供条件验证

  • 在处理程序方法中使用Spring。这允许您在控制器中应用不同的验证

  • 以下是我的例子:


  • 您需要更清楚地了解您的术语,也许可以提供一些伪代码来演示您想要的内容。复制您所描述的属性是否允许对实体持久性进行充分的.equals()比较?也就是说,假设我配对了.equals()方法,只比较attr值,而不是Id/timestamp,我忘记了bean验证——所以我想说Neil McGuigans的答案比我的好——最好尝试使用这个方法。非常好的建议。您能建议我如何编写单元测试以确保我的控制器拒绝记录吗?
    Entity1 entity1 = ...
    Entity2 entity2 = new Entity2();
    entity2.setProperty(entity1.getProperty());
    ...
    entityManager.persist(entity2);
    entityManager.delete(entity1);