JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

SpringBoot结合Validation封装参数校验,这些实用技巧一定要掌握

wys521 2025-02-03 15:40:47 精选教程 19 ℃ 0 评论

今日头条的 Java 小伙伴们!今天咱要深入聊聊 Spring Boot 结合 Validation 封装参数校验这个超实用且关键的话题。

想象一下,你精心打造的 Spring Boot 应用就如同一辆豪华跑车,而参数校验便是保障这辆跑车安全、高效行驶的核心部件。要是参数校验出现漏洞,那各种问题就会如潮水般涌来,让你应接不暇。所以,熟练掌握 Spring Boot 结合 Validation 封装参数校验的技巧,是你在 Java 开发之路上迈向高手境界的重要一步。

接下来,咱们详细说说这些实用技巧以及在实际项目中的应用案例。

一、引入 Validation 依赖

这是开启强大参数校验功能的第一步,就像为跑车安装先进的安全系统。在 Maven 项目的 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

添加完成后,Validation 的强大力量就准备好为你服务啦!

二、使用注解进行基本校验

Validation 提供了一系列便捷的注解,能轻松实现对参数的各种基本校验。例如,要校验用户输入的用户名不能为空且长度不超过 20 个字符,只需在对应的字段上添加 @NotBlank 和 @Size 注解:

public class User {

    @NotBlank(message = "用户名不能为空")
    @Size(max = 20, message = "用户名长度不能超过 20 个字符")
    private String username;

    // 其他字段和方法
}

当调用包含这个 User 对象的接口时,若用户名不符合校验规则,Spring Boot 会自动抛出异常,告知参数校验未通过,是不是特别方便呢?

三、自定义校验注解

有时,Validation 的基本注解可能无法满足特殊需求,这时就需要自定义校验注解啦。比如,要校验用户输入的手机号码是否符合格式,可以按以下步骤实现:

步骤 1:创建自定义注解类

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = PhoneValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidPhone {

    String message() default "手机号码格式不正确";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

步骤 2:编写对应的校验器类

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {

    private static final String PHONE_REGEX = "^1[3-9]\\d{9}#34;;

    @Override
    public void initialize(ValidPhone constraintAnnotation) {
    }

    @Override
    public boolean isValid(String phone, ConstraintValidatorContext context) {
        return phone!= null && phone.matches(PHONE_REGEX);
    }
}

现在,就可以在实体类中使用这个自定义注解啦:

public class User {

    @ValidPhone
    private String phone;

    // 其他字段和方法
}

四、分组校验

不同场景下对同一参数可能有不同的校验规则,分组校验就能很好地应对这种情况。比如在用户注册和修改信息时,对用户名的校验规则可能不同,注册时要求不能为空,修改时则允许为空。

实现步骤如下

步骤 1:定义校验组接口

public interface RegistrationGroup {
}

public interface UpdateGroup {
}

步骤 2:在字段上指定校验组

public class User {

    @NotBlank(message = "用户名不能为空", groups = RegistrationGroup.class)
    private String username;

    // 其他字段和方法
}

步骤 3:在控制器方法中指定校验组

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping("/register")
    public String register(@Validated(RegistrationGroup.class) User user) {
        // 处理用户注册逻辑
        return "注册成功";
    }

    @PutMapping("/update")
    public String update(@Validated(UpdateGroup.class) User user) {
        // 处理用户修改信息逻辑
        return "修改成功";
    }
}

这样,在不同场景下就能根据指定的校验组进行相应的参数校验啦!

五、统一异常处理

当参数校验不通过时,Spring Boot 会抛出 MethodArgumentNotValidException 异常。为了给用户提供更友好的提示信息,我们可以统一处理这个异常。

实现步骤

创建一个全局异常处理类,使用 @ControllerAdvice 注解标注:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public Result handleValidationException(MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        List<String> errorMessages = new ArrayList<>();
        for (FieldError fieldError : fieldErrors) {
            errorMessages.add(fieldError.getDefaultMessage());
        }
        return Result.error(ResultCode.PARAM_ERROR, errorMessages);
    }
}

通过这个异常处理类,将参数校验不通过的错误信息封装成统一格式返回给前端,方便前端进行相应处理。

实际项目案例

案例一:电商平台的商品添加功能

在电商平台中,商品添加时需要对各项参数进行严格校验。比如商品名称不能为空且长度不超过 50 个字符,商品价格必须大于 0 ,库存数量不能为负数等。

在商品实体类中使用相应注解进行校验:

public class Product {

    @NotBlank(message = "商品名称不能为空")
    @Size(max = 50, message = "商品名称长度不能超过 50 个字符")
    private String name;

    @DecimalMin(value = "0.01", message = "商品价格必须大于 0")
    private BigDecimal price;

    @Min(value = 0, message = "库存数量不能为负数")
    private Integer stock;

    // 其他字段和方法
}

在商品添加的接口方法中,使用 @Valid 注解对传入的商品参数进行校验,确保参数符合要求。

案例二:用户注册与登录功能

对于用户注册,需要校验用户名、密码、邮箱等信息。用户名不能为空且长度在 6 - 20 个字符之间,密码必须符合复杂度要求(包含数字、字母、特殊字符,长度至少为 8 位),邮箱格式必须正确。

用户实体类的校验注解如下:

public class User {

    @NotBlank(message = "用户名不能为空")
    @Size(min = 6, max = 20, message = "用户名长度必须在 6 - 20 个字符之间")
    private String username;

    @Pattern(regexp = "^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[@#$%^&+=]).{8,}#34;, message = "密码必须包含数字、字母和特殊字符,长度至少为 8 位")
    private String password;

    @Email(message = "邮箱格式不正确")
    private String email;

    // 其他字段和方法
}

在用户注册和登录的接口方法中,同样借助 @Valid 注解进行参数校验。

案例三:在线预约系统

在线预约系统中,用户预约服务时,需要对预约时间、预约人数等参数进行校验。预约时间必须在当前时间之后,预约人数不能超过服务可容纳的最大人数。

预约实体类中的校验注解如下:

public class Appointment {

    @Future(message = "预约时间必须在当前时间之后")
    private LocalDateTime appointmentTime;

    @Max(value = 100, message = "预约人数不能超过 100 人")
    private Integer numberOfPeople;

    // 其他字段和方法
}

通过在预约实体类中添加校验注解,并在预约接口方法中进行参数校验,保证系统能够正确处理用户输入的预约信息。

小伙伴们,Spring Boot 结合 Validation 封装参数校验在实际项目中的应用是不是很广泛且实用呢?掌握这些技巧,不仅能提高开发效率,还能让你的系统更加稳定可靠,提升用户体验。你在实际项目开发中有没有运用过这些技巧呢?快来评论区分享你的经验吧!如果这篇文章对你有帮助,别忘了点赞、转发哦,让更多的小伙伴受益!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表