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);