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日

相关文章

  • Java项目开启远程调试的方法步骤(tomcat、springboot)

    当我们遇到 Java 项目中出现奇怪的问题时,远程调试是一种非常有用的方法,它可以帮助我们定位问题并解决它。在这里,我们将讨论如何在 Tomcat 和 Spring Boot 中开启 Java 项目的远程调试。 开启 Tomcat 远程调试 步骤 1:修改 Tomcat 启动脚本 找到你的 Tomcat 安装路径下的 bin 目录,打开 catalina.s…

    Java 2023年5月19日
    00
  • Mybatis Plus 增删改查的实现(小白教程)

    MyBatis Plus 是基于 MyBatis 的增强工具,简化了 MyBatis 的使用,提供了很多增强功能。相比于原生 MyBatis,MyBatis Plus 更加易用,使用 MyBatis Plus 可以加快开发效率。本文主要介绍如何使用 MyBatis Plus 进行常见的增删改查操作。 安装 MyBatis Plus 要使用 MyBatis P…

    Java 2023年5月20日
    00
  • Spring IO Platform简单介绍

    下面我就为您介绍一下“Spring IO Platform简单介绍”的完整攻略。 1. Spring IO Platform简介 Spring IO Platform是一个基于Spring的生态系统,为使用Spring的开发人员提供了一个完整的解决方案。它包含了许多Spring生态系统中最常用的库,使开发人员可以更加轻松地构建复杂的应用程序。Spring I…

    Java 2023年5月19日
    00
  • java获取Date时间的各种方式汇总

    Java获取Date时间的各种方式汇总 Date类作为Java中常用的日期时间操作类,提供了多种获取时间的方式。本文将为大家详细介绍Java中常见的Date时间获取方式,希望对大家有所帮助。 currentTimeMillis() currentTimeMillis()方法返回当前系统时间的毫秒数。可以通过将这个时间链接到Date构造函数中来创建对应的Dat…

    Java 2023年5月20日
    00
  • 详解SpringBoot时间参数处理完整解决方案

    下面我将详细讲解“详解SpringBoot时间参数处理完整解决方案”的完整攻略。 一、背景简介 在SpringBoot应用开发中,我们经常需要处理时间类型的参数。而在不同的场景下,我们需要对时间参数的传参方式进行不同的处理。本篇文章将对SpringBoot时间参数的传入方式和处理方式进行深入探讨,并给出完整的解决方案。 二、时间参数的传入方式 时间参数作为U…

    Java 2023年5月20日
    00
  • 你真的知道Java中对象的销毁吗

    当一个Java对象不再被程序使用时,它会被JVM自动回收,这个过程称为垃圾回收(Garbage Collection)。垃圾回收器会扫描堆中的所有对象,将未被引用的对象回收,腾出空间供其他对象使用。 Java 中对象的销毁与使用无关,取决于对象是否被垃圾回收器扫描到并回收,因此需要了解垃圾回收机制。 具体来说,Java 的垃圾回收器主要通过以下两个机制进行对…

    Java 2023年5月26日
    00
  • java jdbc连接和使用详细介绍

    Java JDBC连接和使用详细介绍 什么是JDBC? JDBC(Java Database Connectivity)是Java语言操作数据库的统一接口,它为访问不同的数据库提供了一个标准的类库。使用JDBC可以实现Java和数据库的交互操作。 JDBC步骤 使用JDBC进行数据库操作主要包括以下步骤: 加载JDBC驱动程序 建立数据库连接 创建Prepa…

    Java 2023年5月23日
    00
  • SpringBoot整合mybatis简单案例过程解析

    下面是Spring Boot整合MyBatis的攻略过程,包含两条示例: 一、创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目,可以使用IDEA直接创建,也可以使用Spring Initializr创建。 使用Spring Initializr创建项目时,需要勾选Web、MyBatis和MySQL等必要的依赖。创建完成后,项目…

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