首页 > 解决方案 > Spring Boot:非实体 bean 验证不起作用

问题描述

我有普通的 Java POJO 类,它不是实体类,名为 Student。我正在使用弹簧启动验证器。在我的 REST 控制器中,对于一个请求,只会返回一个学生对象。我在 Student 类中设置了不同的验证。但验证不起作用。我已经给出了 10 到 30 岁的年龄限制。但它正在创建 35 岁的对象。有什么办法可以使这个验证工作?注意:我这样做是为了测试,如果这个验证有效,我将在我的主项目中使用它。

学生

package com.mkyong;

import org.springframework.beans.factory.annotation.Required;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;

@Validated
public class Student {

    @NotEmpty
    private String id;
    @NotEmpty
    private String name;
    @Min(10)
    @Max(30)
    private int age;

    public Student() {
    }

    public Student(String id, String name, @Min(10) @Max(30) int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge( @Min(10) @Max(30) int age) {
        this.age = age;
    }
}

**休息控制器:**

public class BookController {

    // Find
    @GetMapping("/student")
    Student studentCreate() {
        Student student = new Student("","",35);
        student.setAge(36);
        return student;
    }
}

标签: javaspringspring-bootvalidation

解决方案


  • 如果您的请求正文参数将使用注释进行@Valid注释,您的实体将被自动验证
  • 您可以使用以下方法手动验证您的实体:javax.validation.Validator

按照你的情况:

  • 在 BookController 中注入验证器。
  • Validator#validate使用您的 DTO 作为参数调用。
  • 检查是否存在违规行为
public class BookController {

    @Autowired
    Validator validator;

    // Find
    @GetMapping("/student")
    Student studentCreate() {
        Student student = new Student("","",35);
        student.setAge(36);
        Set<ConstraintViolation<Student>> result = validator.validate(student);
        if (!result.isEmpty()) {
                //do here whatever you want with each validation violation.
        }
        return student;
    }
}

有关更多详细信息,请查看官方文档:https ://docs.spring.io/spring-framework/docs/current/reference/html/core.html#validation

注意: 取决于您的 Spring Boot 版本,您的org.springframework.boot:spring-boot-starter-validation依赖项中可能缺少依赖项,因此请仔细检查它是否存在。


推荐阅读