如何仅在 mvc 层上排除验证属性(并保留数据库层)?
How to exclude validation properties only on the mvc layer (and keep for database layer)?
我想对数据库持久性和 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 实现此要求。
你首先为持久性验证案例引入一个新接口让我们说:
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 仅针对给定的 group.Because 进行验证,默认情况下 javax.validation.groups.Default 组用于验证,您的 MVC 将不检查@NotNull。现在我们告诉 Hibernate 在其 BeanValidationEventListener 激活时使用您的组,以防持久化、更新或删除您的实体。这可以通过设置以下相应属性来完成(请参阅 docs):
- javax.persistence.validation.group.pre-坚持
- javax.persistence.validation.group.pre-更新
- javax.persistence.validation.group.pre-删除
您的用例示例:
<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>
...
我想对数据库持久性和 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 实现此要求。
你首先为持久性验证案例引入一个新接口让我们说:
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 仅针对给定的 group.Because 进行验证,默认情况下 javax.validation.groups.Default 组用于验证,您的 MVC 将不检查@NotNull。现在我们告诉 Hibernate 在其 BeanValidationEventListener 激活时使用您的组,以防持久化、更新或删除您的实体。这可以通过设置以下相应属性来完成(请参阅 docs):
- javax.persistence.validation.group.pre-坚持
- javax.persistence.validation.group.pre-更新
- javax.persistence.validation.group.pre-删除
您的用例示例:
<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>
...