gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:11:48 27 4
gpt4 key购买 nike

我想对数据库持久性和 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 可为空,而持久层中您希望它不为空。

您可以使用 Validation Groups 来实现此要求。

您首先为持久性验证案例引入一个新接口(interface),可以这样说:

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 被激活时使用您的组,以防止持久化、更新或删除您的实体。这可以通过设置以下相应的属性来完成(请参阅 docs ):

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

关于java - 如何仅在 mvc 层排除验证属性(并保留数据库层)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49901111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com