Hibernate + Spring:创建bean验证的条件

时间:2017-09-29 15:36:29

标签: java spring hibernate rest validation

我使用@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不再有效。

有一个简单的内置解决方案只能在创建事件上触发某个验证吗?

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

1 个答案:

答案 0 :(得分:2)

您可以使用Grouping Constraints限制使用哪个验证集:pre-persistpre-updatepre-removeddl(对于数据库架构)。

因此,要仅为持久操作验证from字段并将其忽略为put(更新),您可以:

添加界面,例如GroupFuture

package com.example.entity;

public interface GroupFuture {}

MyEntity中,我认为您还应添加@NotNull约束,@Futurenull视为有效值:

//...
//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