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 Agent探针技术详解示例

    Java Agent指的是一种能够以独立的模块形态运行的Java程序,它可以在应用程序运行期间在代码层面上监测应用程序的运行情况,记录应用程序运行过程中的各种参数和信息,这些信息对于分析系统性能、查找故障等都有着非常重要的意义。本文将从以下两个方面详细讲解Java Agent探针技术的应用。 Java Agent探针技术的基本原理 Java Agent探针技…

    Java 2023年5月26日
    00
  • java日期时间格式化@JsonFormat与@DateTimeFormat的使用

    下面就为您详细讲解“java日期时间格式化@JsonFormat与@DateTimeFormat的使用”的完整攻略。 一、前言 在开发 Java 项目时,常常需要对日期时间进行格式化。这时,我们就可以使用@JsonFormat和@DateTimeFormat这两个注解来实现。 二、@JsonFormat注解 @JsonFormat注解是用来指定Java对象的…

    Java 2023年5月20日
    00
  • maven导入本地仓库jar包,报:Could not find artifact的解决

    首先,出现”Could not find artifact”错误提示通常是因为Maven从中央仓库找不到对应的依赖。 要解决此问题,我们可以将需要依赖的jar包手动下载到本地,并将其安装到Maven本地仓库中。 以下是完整攻略: 第一步:下载需要的jar包 在官方网站或者其他可信赖的网站上下载需要的jar包 如果网站提供了md5或sha1值,请进行验证以确保…

    Java 2023年6月2日
    00
  • java实现计算器加法小程序(图形化界面)

    Java实现计算器加法小程序(图形化界面) 本文将详细讲解如何使用Java语言实现一个基本的计算器加法小程序,并提供代码示例说明。以下是完整的攻略: 步骤一:创建项目 首先,我们需要创建一个Java项目,并将其命名为“calculator”。 步骤二:添加图形用户界面 我们将会使用Java Swing库来添加图形用户界面(GUI)。 我们可以通过创建一个JF…

    Java 2023年5月23日
    00
  • 分享Java常用开发编辑器工具

    下面是详细的讲解。 分享Java常用开发编辑器工具 一、介绍 Java是一种广受欢迎的编程语言,它可以帮助开发人员快速、高效地编写和调试代码。但想要成为一名优秀的Java开发人员,除了熟悉语言规范和基础知识外,还需要掌握一些高效的开发工具。本文将分享一些常用的Java开发编辑器工具,帮助Java开发人员更高效地编写代码。 二、常用的Java开发编辑器工具 1…

    Java 2023年5月23日
    00
  • JSP导出Excel文件的方法

    JSP导出Excel文件是一种常见的需求,在这里给出一个JSP导出Excel文件的完整攻略。 1. 准备工作 首先需要引入先关依赖。 jxl.jar (可从网络上下载):jxl是一款专门用于处理Excel文件的java类库,其中包含了读取和写入Excel文件等相关操作。 2. 导出Excel文件的主要过程 (1)定义数据集并填充数据 首先,我们需要定义一个要…

    Java 2023年6月15日
    00
  • eclipse创建springboot项目的三种方式总结

    在Eclipse中,我们可以使用以下三种方式来创建Spring Boot项目: 使用Spring Initializr创建项目 使用Eclipse自带的Spring Boot项目向导创建项目 使用Maven或Gradle创建项目 以下是每种方式的详细步骤和示例: 1. 使用Spring Initializr创建项目 步骤 打开Eclipse,选择File -…

    Java 2023年5月14日
    00
  • MyBatis的嵌套查询解析

    MyBatis是一个非常强大的ORM框架,为开发人员提供了很多便利,其中嵌套查询是其功能之一,主要用于处理某个表或视图中某些字段需要查询其他表或视图得到对应值的情况。这里提供一个详细的攻略,帮助开发者掌握MyBatis中嵌套查询的使用。 什么是嵌套查询 嵌套查询是MyBatis中一种复杂的查询操作。它是在一个查询语句中,嵌套了另外的查询语句。在这个过程中,可…

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