javax验证约束在Spring Boot中不起作用

时间:2019-06-10 14:03:00

标签: java spring-boot validation constraints

我无法在Spring Boot应用程序中触发诸如@ NotEmpty,@ NotBlank和@NotNull之类的注释。

我遵循了这个(maven)示例:

https://spring.io/guides/gs/validating-form-input/

...而且我看不到我在做什么错。

POJO:

import javax.validation.constraints.NotBlank;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class College
{    
    @NotBlank
    private String collegeCode;
.
.
.

Spring控制器:

@RequestMapping(value="/addCollege", method = RequestMethod.POST) 
public String addCollege(@Valid @ModelAttribute("college") College college, BindingResult bindingResult, Model model, HttpSession session)
{
    if(bindingResult.hasErrors()) //this is never true
    {
        logger.debug("Errors when adding new college!!!");
        return "admin/colleges/addCollege";
    }
    collegeProcessor.saveCollege(college);
    return getAllColleges(model, session);
}

屏幕:

<form action="#" th:action="${addOrEdit} == 'add' ? @{/addCollege} : @{/updateCollege}" th:object="${college}" method="post">

    <table class="table">

        <tr>
            <td>College Code</td>
            <td><input size="10" name="collegeCode" th:field="*{collegeCode}"/></td>
            <div id="errors" th:if="${#fields.hasErrors('collegeCode')}" th:errors="*{collegeCode}"></div>
        </tr>
.
.
.

和@NotBlank一样,我也尝试过@NotEmpty和@NotNull,但是会发生相同的事情。我的屏幕未验证输入,并允许保存带有空CollegeCode的大学对象。

有趣的是,如果我将POJO更改为使用不推荐使用的Hibernate验证程序,那么...

import org.hibernate.validator.constraints.NotBlank;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class College
{
    @NotBlank
    private String collegeCode;
.
.
.

...然后验证生效,并且屏幕阻止我保存带有空CollegeCode的College对象。

有人可以告诉我为什么使用javax.validation.constraints验证器时我的验证不起作用吗?

5 个答案:

答案 0 :(得分:15)

自版本2.3.0.RELEASE起,默认情况下,验证启动器未包含在web / webflux启动器中,因此您需要手动添加它。更多详细信息here

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

答案 1 :(得分:4)

在pom.xml中包含2.3.0.RELEASE的Maven依赖关系,但是,较低版本的Spring Boot Application不需要。

Small strings (<= 23 chars) are stored in-situ without memory allocation.
Medium strings (24 - 255 chars) are stored in malloc-allocated memory and copied eagerly.
Large strings (> 255 chars) are stored in malloc-allocated memory and copied lazily.

答案 2 :(得分:0)

请在您的上下文中添加一个bean MethodValidationPostProcessor

 @Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
}

答案 3 :(得分:0)

有完全相同的问题,不知道该怎么办。所有需要的类都在类路径中,没有jar地狱等。

答案 4 :(得分:0)

我想我已经解决了这个问题。我有同样的问题,并尝试降低Spring Boot版本。我将我的春季启动版本从2.3.0.RELEASE降低到2.2.7.RELEASE,它可以工作) 也许这个答案会帮助某人。