Spring-Validation 后端数据校验的实现

下面我将为你详细讲解如何使用Spring-Validation实现后端数据校验的攻略。

什么是Spring-Validation?

Spring-Validation是Spring框架中的一部分,可以用来实现后端的数据校验。它提供了很多常见的校验规则,也允许我们自定义校验规则。

Spring-Validation 的使用

引入依赖

首先,我们需要在pom.xml中引入Spring-Validation的依赖:

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

定义校验规则

我们可以使用javax.validation.constraints包下的注解来定义校验规则。例如,我们可以为一个User类定义如下的校验规则:

public class User {

    @NotNull(message = "用户名不能为空")
    @Size(min = 2, max = 10, message = "用户名长度必须在{min}-{max}之间")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, max = 20, message = "密码长度必须在{min}-{max}之间")
    private String password;

    @NotNull(message = "年龄不能为空")
    @Min(value = 18, message = "年龄必须大于等于{value}")
    @Max(value = 120, message = "年龄必须小于等于{value}")
    private Integer age;

    // getters and setters...
}

上面定义了三个字段(用户名,密码,年龄),每个字段都使用了javax.validation.constraints包下的注解来定义校验规则。

校验数据

我们可以使用Spring提供的@Validated注解来标记一个需要校验数据的方法或类。例如,我们可以为一个UserController类定义如下的校验方法:

@RestController
@RequestMapping("/user")
@Validated
public class UserController {

    @PostMapping("/")
    public String addUser(@RequestBody @Valid User user) {
        // 处理添加用户的逻辑...
        return "success";
    }
}

上面的addUser方法用@Valid注解标记了User参数,这样Spring就会在方法执行前自动校验User对象中的字段。

处理校验结果

如果校验失败,Spring会抛出一个MethodArgumentNotValidException异常。我们可以通过@ControllerAdvice和@ExceptionHandler注解来统一处理这个异常。例如,我们可以为上面的UserController类定义如下的异常处理方法:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String handle(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        StringBuilder sb = new StringBuilder();
        bindingResult.getFieldErrors().forEach(
                fieldError -> sb.append(fieldError.getDefaultMessage()).append(";")
        );
        return sb.toString();
    }
}

上面的方法会把校验失败的结果(即每个字段的错误信息)组装成一个字符串返回。

示例

下面通过两个示例来演示Spring-Validation的使用。

示例1

假设我们需要为一个HTTP接口添加数据校验。请求参数是一个JSON对象,包含两个字段:姓名和年龄。我们要求姓名不能为空,年龄必须大于等于0。

首先,我们需要为请求参数定义一个类:

public class Person {
    @NotBlank(message = "姓名不能为空")
    private String name;
    @Min(value = 0, message = "年龄必须大于等于0")
    private int age;
    // getters and setters...
}

上面的代码中,我们使用了@NotBlank注解(来自于javax.validation.constraints包)来校验name字段不为空,使用了@Min注解来校验age字段必须大于等于0。

然后,我们可以为处理请求的Controller类添加@Valid注解,来自动校验参数:

@RestController
@RequestMapping("/person")
public class PersonController {
    @PostMapping("/")
    public String addPerson(@RequestBody @Valid Person person) {
        // 处理添加person的逻辑...
        return "success";
    }
}

上面的代码中,我们在参数Person前添加了@Valid注解,这样Spring会自动校验Person的每个字段。

最后,我们需要为Controller类定义一个异常处理方法来处理校验失败的情况:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String handleValidationException(MethodArgumentNotValidException e) {
        return e.getBindingResult().getFieldErrors().stream()
                .map(FieldError::getDefaultMessage)
                .collect(Collectors.joining(", "));
    }
}

上面的代码中,我们定义了一个GlobalExceptionHandler类,并使用@RestControllerAdvice注解标记它。然后,我们添加了一个方法,用于处理事件MethodArgumentNotValidException。其中,getFieldErrors()方法用于获取校验结果的所有错误,getDefaultMessage()方法用于获取错误的消息内容。最后,我们使用Java 8中的Stream API将多个错误消息拼接起来。

示例2

假设我们需要为一个Java Bean对象定义校验规则。Bean对象包含4个字段:用户名、密码、Email、年龄。我们要求用户名、密码、Email都不能为空,年龄必须大于等于0。

首先,我们需要定义一个Java Bean:

public class User {
    @NotBlank(message = "用户名不能为空")
    private String username;
    @NotBlank(message = "密码不能为空")
    private String password;
    @NotBlank(message = "Email不能为空")
    @Email(message = "Email格式不正确")
    private String email;
    @Min(value = 0, message = "年龄必须大于等于0")
    private int age;
    // getters and setters...
}

上面的代码中,我们使用了@NotBlank、@Email、@Min等注解来定义了校验规则。其中,@NotBlank用于判断字符串不为空,@Email用于判断字符串格式为Email,@Min用于判断数字大于等于某个值。

然后,我们需要为一个Service类添加@Validated注解,来自动校验参数:

@Service
@Validated
public class UserService {
    public void addUser(@Valid User user) {
        // 处理添加user的逻辑...
    }
}

上面的代码中,我们在参数User前添加了@Valid注解,这样Spring会自动校验User的每个字段。

最后,我们可以添加一个测试用例(例如JUnit),来测试校验逻辑是否正确:

public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test(expected = ConstraintViolationException.class)
    public void testAddUserFailed() {
        User user = new User();
        userService.addUser(user);
    }

    @Test
    public void testAddUserSuccess() {
        User user = new User();
        user.setUsername("test");
        user.setPassword("123456");
        user.setEmail("[email protected]");
        user.setAge(20);
        userService.addUser(user);
    }
}

上面的代码中,我们使用了Junit框架来测试Service类的校验逻辑。在第一个测试用例中,我们没有为User对象设置任何属性,这样会触发校验逻辑,并抛出ConstraintViolationException异常。在第二个测试用例中,我们设置了所有必要的属性,这样校验逻辑会通过。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring-Validation 后端数据校验的实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • SpringBoot整合MyBatisPlus详解

    下面是关于“SpringBoot整合MyBatisPlus详解”的完整攻略: 1. 环境准备 JDK 1.8及以上 Maven 3.0或更高版本 SpringBoot 2.x MyBatisPlus 3.x 2. 依赖导入 在pom.xml文件中添加如下依赖: <dependency> <groupId>com.baomidou&lt…

    Java 2023年5月20日
    00
  • SpringBoot统一返回JSON格式实现方法详解

    根据你给出的主题,我将为你提供一个完整的 Spring Boot 统一返回 JSON 格式的实现方法攻略。 什么是 Spring Boot 统一返回 JSON 格式 Spring Boot 是一种基于 Spring 框架的轻量级应用程序开发框架,它可以非常快速地构建 Web 应用程序和 RESTful 服务。随着 RESTful 服务的流行,Spring B…

    Java 2023年5月20日
    00
  • 优化spring boot应用后6s内启动内存减半

    请允许我详细讲解如何优化Spring Boot应用,使它在6秒内启动并且内存减半: 第一步:分析应用性能 分析应用是优化性能的第一步,了解应用的瓶颈并进行针对性优化。可以使用Spring Boot Actuator来分析应用的性能,包括各个端点的响应时间和应用的吞吐量。同时,还可以使用Java监控工具来查看应用的堆内存和线程使用情况。 第二步:优化应用配置 …

    Java 2023年5月20日
    00
  • java中年月日的加减法使用示例

    下面是“Java中年月日的加减法使用示例”的完整攻略: 一、通过Calendar类进行加减法计算 Calendar是Java平台中操作日历时间的类,它提供了丰富的设置、获取、增减和处理年月日等操作方法。下面提供两个示例代码,分别用于实现“加上一年”和“减去两个月”的功能: 1. 加上一年 Calendar calendar = Calendar.getIns…

    Java 2023年5月20日
    00
  • JSP开发之Struts2实现下载功能的实例

    我们先来讲一下Struts2实现下载功能的基本路线。一般来说,实现下载功能需要经过以下步骤: 点击下载按钮或链接,请求下载文件 后台调用方法生成文件下载流 将文件下载流写入response中,浏览器开始下载 在Struts2框架中,可以利用这个路线实现下载功能。接下来我们具体讲一下: 准备工作 编写jsp页面提供下载按钮或链接:通过向服务器发送请求,请求下载…

    Java 2023年5月20日
    00
  • Spring Boot实现热部署的五种方式

    以下是详细讲解“Spring Boot实现热部署的五种方式”的完整攻略: 1.使用spring-boot-devtools Spring Boot提供了spring-boot-devtools工具让我们实现热部署。只需要将依赖添加到pom.xml文件中即可。 示例代码如下: 1.添加依赖 <dependency> <groupId>o…

    Java 2023年5月19日
    00
  • 基于java文件上传-原始的Servlet方式

    下面是基于Java文件上传-原始的Servlet方式的完整攻略。 准备工作 在开始前,我们需要几个准备工作: 1.安装JDK并配置环境变量2.安装Tomcat并配置环境变量3.新建一个Java Web项目 编写HTML页面 在项目的WebContent目录下新建一个html文件,编写如下代码: <html> <body> <fo…

    Java 2023年6月15日
    00
  • Java中将String类型依照某个字符分割成数组的方法

    Java 中将 String 类型按照某个字符分割成数组的方法比较简单,主要通过 String 类中的 split() 方法实现。下面是详细的攻略: 1. String 类中的 split() 方法 split() 方法能够将 String 类型的字符串根据指定字符进行拆分成一个数组,具体语法如下: public String[] split(String …

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部