如何仅在 mvc 层上排除验证属性(并保留数据库层)?



我想对数据库持久性和 Web 服务json请求使用相同的 bean。

问题:我有一个属性,该属性永远不应由 Web 服务用户设置,但在持久性之前由应用程序填充。数据库中的字段被标记为不为空,因此域验证为:@NotNull

但是如果我添加这个,那么 spring-mvc 也将验证传入的 json 请求,并在未设置id时抛出异常(但这是需要的)。

问题:如何仅在 mvc 层上排除某些验证属性?

@Entity
public class Person {
@Id
@NotNull
@JsonIgnore //has no effect
private String id; //to be set by application before persistance
private String name;
private int age;
}
@RestController 
public class PersonController {
@PostMapping
public void post(Person p) {
}
}

您描述的要求是能够根据各自的上下文为同一 Bean 定义不同的约束。在 MVC 层中,您希望 id 可为空,而持久性层希望它不为空。

可以使用验证组实现此要求。

您首先为持久性验证案例引入了一个新接口,例如:

public interface PersistenceGroup {
}

然后,您将 bean 更改为:

@Entity
public class Person {
@Id
@NotNull(groups = PersistenceGroup.class)
private String id; //to be set by application before persistance
private String name;
private int age;
}
@RestController 
public class PersonController {
@PostMapping
public void post(Person p) {
}
}

这具有仅针对给定组验证@NotNull的效果。因为缺省情况下使用 javax.validation.groups.Default 组进行验证,所以 MVC 不会检查@NotNull。现在,我们告诉Hibernate在其BeanValidationEventListener被激活时使用您的组,以防持久化,更新或删除您的实体。这可以通过设置以下属性的相应属性来完成(请参阅文档):

  • javax.persistence.validation.group.pre-persist
  • javax.persistence.validation.group.pre-update
  • javax.persistence.validation.group.pre-remove

您的使用案例示例:

<hibernate-configuration>
<session-factory>
...
<property name="javax.persistence.validation.group.pre-persist">
javax.validation.groups.Default,your.package.PersistenceGroup
</property>
<property name="javax.persistence.validation.group.pre-update">
javax.validation.groups.Default,your.package.PersistenceGroup
</property>
...

相关内容

  • 没有找到相关文章

最新更新