Java使用@Validated注解进行参数验证的方法

下面是详细的讲解。

一、什么是@Validated注解?

Java中,我们经常需要对请求传入的参数进行验证。为了实现验证,我们需要使用注解。而@Validated注解就是Spring框架中用于对方法入参进行校验的注解之一。它一般与@RequestParam@RequestBody等注解结合使用。

二、使用@Validated注解进行参数验证的方法

1. 添加依赖

在使用@Validated注解进行参数验证之前,需要将相应的依赖添加到pom.xml文件中。

<!-- 添加相关依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 在参数上添加@Validated注解

在Controller的接收请求的方法中,使用@Validated注解标注需要验证的参数,通过BindingResult参数获取参数验证结果。下面是一个简单的示例:

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping
    public UserVO addUser(@RequestBody @Validated UserDTO userDTO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            String errorMsg = bindingResult.getFieldError().getDefaultMessage();
            throw new IllegalArgumentException(errorMsg);
        }
        // do add user operation
        // 注意这里需要将 UserDTO 转换成 UserVO
        UserVO userVO = UserDTO.toUserVO(userDTO);
        return userVO;
    }
}

// UserDTO
public class UserDTO {
    @NotBlank(message = "username不能为空")
    private String username;
    @NotBlank(message = "password不能为空")
    private String password;
    // getters and setters
}

// UserVO
public class UserVO {
    private Long id;
    private String username;
    private String password;
    // getters and setters
}

上面的代码中,我们在@PostMapping注解的方法上添加了@Validated注解,并在UserDTO参数上添加了@Validated注解,同时绑定了BindingResult参数。当出现校验不通过的情况时,会将错误信息通过IllegalArgumentException抛出。当校验通过时,将UserDTO转换成UserVO并返回。

3. 校验注解的使用

校验注解用来控制入参是否符合规范,常用的校验注解有如下几种:

  • @NotNull:表示此值不能为null;
  • @NotBlank:表示此值不能为空;
  • @NotEmpty:表示此值不能为空,包括空格和换行符等(即不能为 " " 或 "");
  • @Min:表示此值最小值,只能用于数字类型的参数;
  • @Max:表示此值最大值,只能用于数字类型的参数;
  • @DecimalMin:表示此值最小值,可以用于数字类型和字符串类型的参数;
  • @DecimalMax:表示此值最大值,可以用于数字类型和字符串类型的参数;
  • @Digits:表示数字格式校验,指定整数的位数和小数的位数;
  • @Size:表示集合或数组的大小范围,只能用于集合或数组类型的参数;
  • @Email:表示Email格式的校验;
  • @Pattern:表示正则表达式校验。

下面是一个示例,演示如何使用@Min@Email校验注解:

public class UserDTO {
    @NotBlank(message = "username不能为空")
    private String username;
    @NotBlank(message = "password不能为空")
    private String password;
    @Email(message = "email格式不正确")
    private String email;
    @Min(value = 0, message = "级别最低为0")
    private int level;
    // getters and setters
}

三、完整示例

下面是一个完整的示例代码:

@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 添加用户
     */
    @PostMapping
    public UserVO addUser(@RequestBody @Validated UserDTO userDTO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            String errorMsg = bindingResult.getFieldError().getDefaultMessage();
            throw new IllegalArgumentException(errorMsg);
        }
        // do add user operation
        // 注意这里需要将 UserDTO 转换成 UserVO
        UserVO userVO = UserDTO.toUserVO(userDTO);
        return userVO;
    }
}

// UserDTO
public class UserDTO {
    @NotBlank(message = "username不能为空")
    private String username;
    @NotBlank(message = "password不能为空")
    private String password;
    @Email(message = "email格式不正确")
    private String email;
    @Min(value = 0, message = "级别最低为0")
    private int level;
    // getters and setters
}

// UserVO
public class UserVO {
    private Long id;
    private String username;
    private String email;
    private int level;
    // getters and setters
}

// 测试类
@SpringBootTest
class UserControllerTest {
    @Autowired
    private MockMvc mockMvc;

    /**
     * 添加用户成功的情况
     */
    @Test
    public void testAddUserSuccess() throws Exception {
        String requestBody = "{\"username\":\"jack\",\"password\":\"123456\",\"email\":\"test@test.com\",\"level\":5}";
        mockMvc.perform(MockMvcRequestBuilders.post("/user")
                .contentType(MediaType.APPLICATION_JSON)
                .content(requestBody))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }

    /**
     * 添加用户失败的情况,校验不通过
     */
    @Test
    public void testAddUserFailure() throws Exception {
        String requestBody = "{\"username\":\"\",\"password\":\"\",\"email\":\"test\",\"level\":-1}";
        mockMvc.perform(MockMvcRequestBuilders.post("/user")
                .contentType(MediaType.APPLICATION_JSON)
                .content(requestBody))
                .andExpect(MockMvcResultMatchers.status().isBadRequest())
                .andDo(MockMvcResultHandlers.print());
    }
}

上面的代码演示了如何使用@Validated注解进行参数验证,以及如何使用@NotNull@Email@Min等校验注解。我们可以通过测试类对其进行测试,并验证添加用户操作的正确性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java使用@Validated注解进行参数验证的方法 - Python技术站

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

相关文章

  • Java基础之代码死循环详解

    Java基础之代码死循环详解 简介 代码死循环是指在程序运行过程中,因为某些原因造成程序不停地重复执行某一段代码的现象。死循环通常是因为程序设计不合理或者编写错误所导致的,如果长时间不会自动退出,会造成计算机死机或者卡死。代码死循环是编写程序时需要避免的错误。 常见死循环 for循环死循环 for(int i=0; i>=0; i++){ System…

    Java 2023年5月20日
    00
  • Java由浅入深细数数组的操作上

    Java数组操作完整攻略 一、数组概述 Java数组是一种包含固定数量元素的数据结构,这些元素属于同一种数据类型。 Java数组由以下几个基本点组成: 数组声明 数组的创建 数组的初始化 数组的访问 数组的遍历 二、数组的声明 Java中数组的声明包含两个重要的部分,第一部分是数组的类型,第二部分是数组的名字。如下所示: int[] arr; //第一种声明…

    Java 2023年5月26日
    00
  • Spring获取ApplicationContext对象工具类的实现方法

    获取ApplicationContext对象是在使用Spring框架时非常常见的操作,可以方便地获取容器中的各种Bean实例。在Spring中,有多种方法可以获取ApplicationContext对象,下面给出了两种常用的方式: 方式一:通过注解@Autowried来获取ApplicationContext对象 import org.springframe…

    Java 2023年6月15日
    00
  • java split用法详解及实例代码

    Java split用法详解及实例代码 简介 Java中字符串的split方法,是将字符串根据某个分隔符来拆分成多个子字符串的方法。本文将深入讨论split方法的用法,并提供示例代码帮助理解。 基本使用方法 String[] strArr = str.split(delimiter); 其中,str是需要拆分的字符串,delimiter是拆分的分隔符,str…

    Java 2023年5月23日
    00
  • Java ArrayList集合详解(Java动态数组)

    Java ArrayList集合详解(Java动态数组) 什么是Java ArrayList? 在Java中,ArrayList是一种可以动态增长和缩小的数组序列,它是Array和Vector的非同步版本。它通过继承AbstractList类和实现List接口来提供了大小可以改变的数组的操作。 Java ArrayList的常用方法 1. 添加元素 Arra…

    Java 2023年5月26日
    00
  • JavaSpringBoot报错“NotFoundException”的原因和处理方法

    原因 “Not Found Exception” 错误通常是以下原因引起的: 路径错误:如果您的路径存在问题,则可能会出现此错误。在这种情况下,需要检查您的路径并确保它们正确。 数据库查询问题:如果您的数据库查询存在问题,则可能会出现此错误。在这种情况下,需要检查您的数据库查询并确保它们正确。 代码逻辑问题:如果您的代码逻辑存在问题,则可能会出现此错误。在这…

    Java 2023年5月4日
    00
  • Java LinkedList实现班级信息管理系统

    Java LinkedList实现班级信息管理系统 概述 LinkedList是Java中的一种常用数据结构,它实现了List接口,可以存储任意对象。在班级信息管理系统中,我们可以利用LinkedList来存储学生对象。 实现步骤 1. 定义Student类 在Java LinkedList实现班级信息管理系统中,我们需要先定义一个Student类来表示一个…

    Java 2023年5月24日
    00
  • Java并发编程之对象的共享

    Java并发编程中,多个线程同时访问共享对象时,可能引发多种并发问题,如线程安全问题、死锁问题等。因此,Java并发编程中,对象的共享是一个非常重要的话题。本篇攻略将详细讲解Java并发编程中对象的共享的相关知识。 什么是对象的共享? 对象的共享指的是,多个线程同时访问同一个Java对象的成员变量或方法的情况。在这种情况下,这些线程可能会共享同一个对象的状态…

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