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日

相关文章

  • 关于Ubuntu Server 18.04 LTS 安装Tomcat并配置systemctl管理Tomcat服务的问题

    下面是详细讲解如何在Ubuntu Server 18.04 LTS系统上安装Tomcat并配置systemctl管理Tomcat服务的完整攻略。 1. 安装Tomcat 在Ubuntu Server 18.04 LTS系统上安装Tomcat的方法如下: 软件包更新:需要更新软件包列表和已安装软件包,以防止出现软件包依赖错误等问题,在终端中执行以下命令: su…

    Java 2023年5月19日
    00
  • Java解析xml文件和json转换的方法(DOM4j解析)

    Java解析XML文件和JSON转换的方法(DOM4j解析) 在Java编程中,经常需要解析XML文件或者将JSON字符串转换成Java对象。针对这个问题,我们可以使用DOM4j解析库来处理。下面是详细的使用方法: 解析XML文件 引入依赖库 首先,需要在项目中引入dom4j和jaxen这两个依赖库。在Maven项目中,可以在项目的pom.xml文件中添加以…

    Java 2023年5月26日
    00
  • Java C++题解leetcode字符串轮转KMP算法详解

    Java C++题解leetcode字符串轮转KMP算法详解 1. 题目描述 给定两个字符串s1和s2,判断s2是否可以通过将s1中的某个子串移动后得到。 2. 思路分析 2.1 暴力枚举 我们可以将s1分为两段,任选一段放到另一段的前面,再判断是否与s2相等,如此循环往复。但是这样的时间复杂度为$O(n^2)$。 2.2 KMP算法 我们可以利用KMP算法…

    Java 2023年5月19日
    00
  • 详解Maven命令大全

    下面我将详细讲解“详解Maven命令大全”的完整攻略。 一、Maven命令简介 Maven是一个用于Java项目的构建和管理工具。它利用POM(Project Object Model)来描述项目,可以管理项目的构建、输出、文档、报告以及依赖等。下面是Maven常用的一些命令。 1. mvn clean 清除Maven项目工程的目录,删除target目录下的…

    Java 2023年5月20日
    00
  • 详解数据库连接的URL的写法及总结

    详解数据库连接的URL的写法及总结攻略分为以下几个部分: URL格式介绍 URL参数介绍 常用数据库URL示例 URL格式介绍 数据库连接URL的格式通常如下所示: protocol://username:password@hostname:port/databasename?option1=value1&option2=value2 其中,各部分的…

    Java 2023年6月16日
    00
  • java实现树形菜单对象

    实现树形菜单对象可以采用Java语言和基于树形结构的数据结构,下面是具体的实现攻略: 步骤一:创建树形结构的数据类型 树形菜单对象可以用树形结构数据类型表示,包括各个节点的名称、节点值、父节点、子节点等信息,这个数据结构可以通过类的形式实现: public class TreeNode { private String name; private Objec…

    Java 2023年5月26日
    00
  • 详解Java编译优化之循环展开和粗化锁

    详解Java编译优化之循环展开和粗化锁 在Java程序的运行过程中,编译器可以通过一些技术来对代码进行优化,以提高程序的效率。其中,循环展开和粗化锁是两种常见的编译优化技术。 循环展开 循环展开是指将循环语句中的代码直接复制到循环外执行,以减少循环的迭代次数,从而提高程序的效率。循环展开可以减少循环控制器的操作,减少循环的开销,并可以利用指令级并行性。但是,…

    Java 2023年5月26日
    00
  • java web实现自动登录功能

    实现自动登录功能的主要思路是利用浏览器的cookie机制。当用户登录成功时,服务器会将用户信息保存为cookie,并设置其过期时间。每次用户访问网站时,浏览器会自动将保存的cookie发送到服务器,从而实现免登录访问。 下面是实现自动登录功能的步骤: 1. 编写登录接口 首先需要编写登录接口,当用户点击登录按钮后,将用户名和密码发送到服务器进行验证。验证通过…

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