我使用@Future注释使用日期验证。
@NotNull
@DateTimeFormat(pattern="yyyy-MM-dd")
@Column(name = "FROM")
@Temporal(TemporalType.DATE)
@Future
private Date from;
@NotNull
@Column(name = "FOO")
private String foo;
我使用Rest API执行CRUD操作。要求是from
日期将来 - 在创建实体(今天)之后。但是,时间会发生变化,如果使用ex更改字段foo
。 PUT方法,验证不会通过。
@PutMapping(value = "/{id}")
public ResponseEntity<?> put(
@Valid @RequestBody MyEntity myEntity,
@PathVariable("id") int id)
{
... update entity based on id
}
当我在遥远的未来(在from
值保持不变之后)调用此方法时,验证不允许我执行操作,因为字段from
不再有效。
有一个简单的内置解决方案只能在创建事件上触发某个验证吗?
我一直在考虑通过注释创建自己的跨领域验证,但是我无法根据其他字段确定创建。
答案 0 :(得分:2)
您可以使用Grouping Constraints限制使用哪个验证集:pre-persist
,pre-update
,pre-remove
和ddl
(对于数据库架构)。
因此,要仅为持久操作验证from
字段并将其忽略为put(更新),您可以:
添加界面,例如GroupFuture
:
package com.example.entity;
public interface GroupFuture {}
在MyEntity
中,我认为您还应添加@NotNull约束,@Future
将null
视为有效值:
//...
//Maybe @NotNull
@Future(groups = GroupFuture.class)
private Date from;
//...
最后,如果您使用以下命令配置了hibernate:
persistence.xml
,请在persistence-unit
设置中添加此行:
<property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default, com.example.GroupFuture">
编程:
// 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);
有用的阅读(即使是hibernate 3.6):Chapter 23. Additional modules