返回

校验神器-Spring @Validated注解轻松搞定参数校验

后端

拥抱 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 层校验和自定义校验规则,你可以提高应用程序的健壮性和可靠性,确保你的代码万无一失。

常见问题解答

  1. @Validated 注解适用于哪些类型的数据?

@Validated 注解适用于任何类型的 Java 对象,包括 POJO、DTO 和 Entity。

  1. 我可以使用自己的校验器吗?

是的,你可以通过创建自己的校验注解和实现相应的 Validator 接口来使用自己的校验器。

  1. 如何在 Spring Boot 中配置 @Validated 注解?

在 Spring Boot 中,无需任何特殊配置即可使用 @Validated 注解。它开箱即用。

  1. @Validated 注解会影响性能吗?

通常情况下,@Validated 注解对应用程序的性能影响很小。但是,如果你的应用程序执行大量的校验操作,那么可能会出现轻微的性能下降。

  1. 如何在测试中使用 @Validated 注解?

你可以使用 Mockito 或其他类似的框架来模拟 @Validated 注解的行为,以便在测试中进行校验。