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日

相关文章

  • json的使用小结

    那么我们就来详细讲解一下如何使用JSON以及它的小技巧。 JSON的使用小结 什么是JSON? JSON是JavaScript Object Notation的缩写,它是一种轻量级的数据交换格式,以易读易写的文本格式为基础,通常用于前后端的数据交互。 JSON格式的数据可以被JavaScript直接读取,而且在不同的编程语言中都有自己的库来解析或生成JSON…

    Java 2023年5月26日
    00
  • 如何通过JVM角度谈谈Java的clone操作

    那么让我们来详细讲解如何通过JVM角度谈谈Java的clone操作。 什么是Java的clone操作? Java的clone操作是用于复制Java对象的一种方式。在对一个Java对象进行clone操作时,会创建一个新的对象,新对象与原对象的内容相同,但是两个对象在内存中的地址是不同的。 clone操作的实现方式 Java的clone操作是通过实现Clonea…

    Java 2023年5月26日
    00
  • 详解Spring Boot Security工作流程

    Spring Boot Security是Spring Boot框架中的一个模块,用于提供安全性和身份验证功能。下面是Spring Boot Security的工作流程: 用户尝试访问受保护的资源。 Spring Security拦截请求并检查用户是否已经进行身份验证。 如果用户未经身份验证,则Spring Security将重定向用户到登录页面。 用户输入…

    Java 2023年5月14日
    00
  • Springmvc和ajax如何实现前后端交互

    在 Web 开发中,前后端交互是非常重要的。Spring MVC 和 Ajax 可以很好地实现前后端交互。本文将详细讲解 Spring MVC 和 Ajax 如何实现前后端交互的完整攻略,并提供两个示例说明。 1. Spring MVC 和 Ajax 简介 Spring MVC 是一个基于 Java 的 Web 框架,它可以帮助我们构建 Web 应用程序。A…

    Java 2023年5月18日
    00
  • SpringBoot外部化配置示例解析

    下面我将为你详细讲解“SpringBoot外部化配置示例解析”的完整攻略。 简介 在开发过程中,我们通常会使用外部配置文件,比如properties或者yaml格式的配置文件。其中,Spring Boot利用spring-boot-configuration-processor自动获取并识别配置文件中的属性,使得在Java代码中可以直接使用@Autowire…

    Java 2023年5月19日
    00
  • Java基础-Java的体系结构

    Java的体系结构 Java的体系结构包含三个核心部分:JVM、JRE和JDK。其中JDK是对JRE的扩展,而JRE又是对JVM的扩展。 JVM JVM,即Java虚拟机,是Java平台的最核心部分。它是Java的运行环境,其作用是将Java字节码文件解释成能够在特定操作系统中运行的机器语言,并将其加载到内存中。 Java语言的跨平台特性正是由JVM所实现的…

    Java 2023年5月19日
    00
  • java中找不到符号的解决方案

    当Java程序在编译时出现“找不到符号”的错误时,通常意味着在代码中引用了一个不存在的类、方法或变量。这种错误通常是由以下几种情况引起的: 类或方法拼写错误 缺少必要的库或包 编译时缺少依赖项 尝试在不正确的作用域中引用变量或方法 下面将为您介绍一些可能的解决方案来解决此类问题。 1.检查拼写错误 如果Java程序在编译时出现“找不到符号”的错误,第一步应该…

    Java 2023年5月20日
    00
  • 解决spring security中遇到的问题

    下面我将为你详细讲解解决Spring Security中遇到的问题的完整攻略。 解决Spring Security中遇到的问题的完整攻略 问题描述 当我们在使用Spring Security时,常常会遇到一些问题,比如无法登录、权限校验不起作用等等。 解决攻略 针对这些问题,我们可以采取如下解决攻略: 检查配置:首先检查Spring Security的配置,…

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