校验神器-Spring @Validated注解轻松搞定参数校验
2023-10-09 13:50:54
拥抱 Spring 的@Validated 注解:参数校验的神奇武器
简介
在现代应用程序开发中,确保请求参数的有效性至关重要,这对于维护健壮且可靠的系统至关重要。Spring 框架为我们提供了强大的 @Validated 注解,一个参数校验的神器,可让我们轻松地在控制器方法中实现参数校验。
对象校验:让你的对象健壮起来
当你在控制器方法中接受一个对象参数时,@Validated 注解可以用来校验该对象的属性。首先,导入必要的校验注解,然后使用它们来标注对象的属性。例如:
import javax.validation.constraints.*;
public class User {
@NotNull
private String username;
@Size(min = 6, max = 20)
private String password;
@Email
private String email;
}
最后,在控制器方法中使用 @Validated 注解:
@PostMapping("/register")
public String register(@Validated User user) {
// 校验通过,执行业务逻辑
return "success";
}
嵌套校验:深入到对象的每个角落
如果你需要校验对象中集合属性中的元素,可以使用 @ValidList 注解来接收集合参数。例如:
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;
public class User {
@NotEmpty
@ValidList
private List<Role> roles;
}
并在控制器方法中使用 @ValidList 注解:
@PostMapping("/assignRoles")
public String assignRoles(@Validated User user) {
// 校验通过,执行业务逻辑
return "success";
}
GET 参数校验:让你的 GET 请求更安全
当我们需要校验 GET 请求的参数时,可以在类上使用 @Validated 注解。例如:
@Validated
public class UserController {
@GetMapping("/getUser")
public User getUser(@RequestParam @NotNull Long id) {
// 校验通过,执行业务逻辑
return userService.getUser(id);
}
}
Service 层校验:让你的代码更加健壮
除了在控制器方法中进行校验外,你还可以通过在 Service 层方法中使用 @Validated 注解来校验参数。例如:
import org.springframework.stereotype.Service;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@Service
public class UserService {
public User getUser(@Valid @NotNull Long id) {
// 校验通过,执行业务逻辑
return userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found with id :" + id));
}
}
自定义校验规则:打造你的校验利器
你可以自定义校验规则,并使用 @Validated 注解来实现校验。例如:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PasswordValidator.class)
public @interface Password {
String message() default "Password must contain at least one digit, one uppercase letter and one lowercase letter.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
并在控制器方法中使用自定义注解:
@PostMapping("/register")
public String register(@Validated User user) {
// 校验通过,执行业务逻辑
return "success";
}
总结
Spring 的 @Validated 注解是一个强大的工具,可以让你轻松地在应用程序中实现参数校验。通过使用对象校验、嵌套校验、GET 参数校验、Service 层校验和自定义校验规则,你可以提高应用程序的健壮性和可靠性,确保你的代码万无一失。
常见问题解答
- @Validated 注解适用于哪些类型的数据?
@Validated 注解适用于任何类型的 Java 对象,包括 POJO、DTO 和 Entity。
- 我可以使用自己的校验器吗?
是的,你可以通过创建自己的校验注解和实现相应的 Validator 接口来使用自己的校验器。
- 如何在 Spring Boot 中配置 @Validated 注解?
在 Spring Boot 中,无需任何特殊配置即可使用 @Validated 注解。它开箱即用。
- @Validated 注解会影响性能吗?
通常情况下,@Validated 注解对应用程序的性能影响很小。但是,如果你的应用程序执行大量的校验操作,那么可能会出现轻微的性能下降。
- 如何在测试中使用 @Validated 注解?
你可以使用 Mockito 或其他类似的框架来模拟 @Validated 注解的行为,以便在测试中进行校验。