Java 冬眠+;Spring:以创建bean验证为条件

Java 冬眠+;Spring:以创建bean验证为条件,java,spring,hibernate,rest,validation,Java,Spring,Hibernate,Rest,Validation,我使用日期验证,并使用注释 @NotNull @DateTimeFormat(pattern="yyyy-MM-dd") @Column(name = "FROM") @Temporal(TemporalType.DATE) @Future private Date from; @NotNull @Column(name = "FOO") private String foo; 我使用RESTAPI执行CRUD操作。要求是从开始的日期将在未来-在实体创建之后(今天)。但是,时间会发生变化,如

我使用日期验证,并使用注释

@NotNull
@DateTimeFormat(pattern="yyyy-MM-dd")
@Column(name = "FROM")
@Temporal(TemporalType.DATE)
@Future
private Date from;

@NotNull
@Column(name = "FOO")
private String foo;
我使用RESTAPI执行CRUD操作。要求是从开始的日期将在未来-在实体创建之后(今天)。但是,时间会发生变化,如果使用ex.PUT方法更改字段
foo
,验证将不会通过

@PutMapping(value = "/{id}")
public ResponseEntity<?> put(
    @Valid @RequestBody MyEntity myEntity, 
    @PathVariable("id") int id) 
{
    ... update entity based on id
}
@PutMapping(value=“/{id}”)
公众回应付诸表决(
@有效@RequestBody MyEntity MyEntity,
@路径变量(“id”)int id)
{
…根据id更新实体
}
当我在遥远的将来调用此方法时(在
from
值保持不变之后),验证不允许我执行该操作,因为字段
from
不再有效

有一个简单的内置解决方案,仅在创建事件时触发特定验证

我一直在考虑通过注释创建自己的跨字段验证,但是我无法根据其他字段确定创建。

您可以使用,以限制要使用的验证集:
预持久化
预更新
预删除
ddl
(用于数据库架构)

因此,要从字段验证仅用于持久化操作的
,并忽略用于put(更新)的
,您可以:

添加一个界面,例如
GroupFuture

package com.example.entity;

public interface GroupFuture {}

在您的代码> MyEntity < /代码>中,我认为您还应该将约束添加为<代码> @未来< /代码>考虑<代码> null <代码>为有效值:

//...
//Maybe @NotNull
@Future(groups = GroupFuture.class)
private Date from;

//...
最后,如果您使用以下配置了hibernate:
persistence.xml
,在
持久化单元设置中添加此行:

<property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default, com.example.GroupFuture">
`


有用的阅读资料(即使是针对hibernate 3.6):

更改
foo
字段和使
from
字段无效之间有什么关系?我已经描述过了。来自
字段必须在将来(假设我设置为2天以后)。一周后,我决定使用PUT方法并更改
foo
或其他字段,但@Future条件不会通过,因为一周后,来自
字段将实际成为过去。谢谢,我会尝试一下。
// If you're using pure hibernate
Configuration configuration = new Configuration().setProperty("javax.persistence.validation.group.pre-persist", javax.validation.groups.Default, com.example.GroupFuture);
// If you're using JPA/hibernate
entityManagerFactory.getJpaPropertyMap().put("javax.persistence.validation.group.pre-persist", javax.validation.groups.Default, com.example.GroupFuture);