Spring Form Validation 验证数据库插入?

Posted

技术标签:

【中文标题】Spring Form Validation 验证数据库插入?【英文标题】:Spring Form Validation validates database insert? 【发布时间】:2016-11-26 14:11:34 【问题描述】:

我想使用带有注释的 Spring Validation 来验证我的表单数据。 所以我有以下对象,例如:

@Entity
@ComponentScan
public class Category 

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @NotEmpty
    private String type;

    ...

正如您在此处看到的,我在type 字符串上使用了@NotEmpty。我只想用它来验证我的表单。它不应该验证数据库插入。

所以当我这样做时:

@RequestMapping(value = "/myForm", method = RequestMethod.POST)
public String categoryPOST(HttpServletRequest request, Model model, @Valid Category category, BindingResult bindingResult) 
    if (bindingResult.hasErrors()) 
        return "form";
    

    return "redirect:/results";

它按我希望的方式工作。但是当我必须创建一个虚拟对象时:

Category category = new Category();

然后我对该空对象执行保存:

this.category_repository.save(category);

我得到了错误(只是其中的重要部分):

Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [my.project.jpa.entity.Category] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImplinterpolatedMessage='darf nicht leer sein', propertyPath=type, rootBeanClass=class my.project.jpa.entity.Category, messageTemplate='org.hibernate.validator.constraints.NotEmpty.message'
]

这不是我想要的。我想使用注释进行表单验证,但我不希望对数据库操作执行验证。

这有可能吗?

其他信息

我使用以下方法得到了相同的结果:

javax.validation.constraints.NotNull;

注释。

【问题讨论】:

顺便说一句,实体上的@ComponentScan 注释看起来很奇怪。你确定你需要它吗? 不,不确定。对春天完全陌生。 很可能你可以删除它:docs.spring.io/spring/docs/current/spring-framework-reference/… 【参考方案1】:

是的,这是可能的。

第一个选项是为表单对象 (DTO) 和实体使用不同的类。

第二个选项是配置 Hibernate 并在保存前禁用验证。因为这个问题已经回答了好几次了,所以我将提供他们的链接:

How do you turn off Hibernate bean validation with JPA 1.0? Disabling Hibernate Validation on save/update with Hibernate 3.6.0.Final How to disable Hibernate validation in a Spring Boot project

【讨论】:

好的,但是如果真的总是只想验证表单,而不是数据库操作,但我必须始终使用相同的对象怎么办?我现在正在进行的项目非常庞大,要在代码中找到我必须禁用验证的所有行将花费很长时间。那么有没有更好的方法来仅使用 spring 验证表单帖子? 在休眠配置中,您不是为每个实体禁用验证,而是只禁用一次。或者,您有多个休眠配置?

以上是关于Spring Form Validation 验证数据库插入?的主要内容,如果未能解决你的问题,请参考以下文章

优雅的方式来校验spring-boot的form表单参数和json的body参数合法性验证方式

struts中validation验证无效

Spring Validation 验证框架使用

html 验证表格与原型:列表验证css类:http://inchoo.net/magento/out-of-the-box-form-validation-in-magento/

Spring 使用Validation 验证框架的问题详解

Spring Hibernate Validation