下面是详细的讲解。
一、什么是@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技术站