spring boot中校验参数合法性

举报
林欣 发表于 2024/06/23 16:34:43 2024/06/23
【摘要】 在Spring Boot中,校验参数的合法性通常涉及两个方面:一是定义参数校验的规则,二是确保在请求处理之前执行这些校验。下面我们先从理论层面介绍如何优雅地进行参数校验,然后给出一个实战的例子。 理论部分使用校验注解:Spring Boot支持JSR 303/380校验规范,它提供了一系列注解,如@NotNull、@Min、@Max、@Email等,用于定义参数的校验规则。这些注解可以直接加...

在Spring Boot中,校验参数的合法性通常涉及两个方面:一是定义参数校验的规则,二是确保在请求处理之前执行这些校验。下面我们先从理论层面介绍如何优雅地进行参数校验,然后给出一个实战的例子。

理论部分

  1. 使用校验注解
    Spring Boot支持JSR 303/380校验规范,它提供了一系列注解,如@NotNull@Min@Max@Email等,用于定义参数的校验规则。这些注解可以直接加在请求方法的参数上或者DTO(Data Transfer Object)类的字段上。

  2. 使用DTO
    对于复杂的请求参数,建议使用DTO来封装参数。这样做的好处是:

    • 可以将校验规则与请求方法解耦,使代码更清晰。
    • 可以方便地复用DTO,例如在不同的服务层或控制器中。
  3. 全局异常处理
    当参数校验失败时,Spring Boot会抛出一个MethodArgumentNotValidException异常。为了给用户一个友好的提示,我们需要全局捕获这个异常,并返回自定义的错误信息。

  4. 分组校验
    对于同一个DTO,在不同的业务场景下可能需要不同的校验规则。这时可以使用JSR 303的分组校验功能。

  5. 自定义校验注解
    如果JSR 303提供的注解无法满足需求,可以自定义校验注解。

实战例子

假设我们有一个用户注册接口,需要校验用户名、密码和邮箱的合法性。

  1. 定义DTO
import javax.validation.constraints.*;

public class UserDTO {

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

    @NotNull(message = "密码不能为空")
    @Size(min = 6, max = 20, message = "密码长度必须在6到20个字符之间")
    private String password;

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

    // getters and setters
}
  1. 在控制器中使用DTO
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Validated
public class UserController {

    @PostMapping("/register")
    public String register(@RequestBody @Validated UserDTO userDTO) {
        // 处理注册逻辑
        return "注册成功";
    }
}

注意:在@RequestBody@Validated注解之间没有任何参数,这是因为@Validated默认会校验其后面的对象(即UserDTO)。

  1. 全局异常处理
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleValidationExceptions(MethodArgumentNotValidException ex) {
        List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();
        String errorMessage = fieldErrors.stream()
                .map(FieldError::getDefaultMessage)
                .reduce((s1, s2) -> s1 + "; " + s2)
                .orElse("Validation failed");

        return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
    }
}

这样,当参数校验失败时,用户会收到一个包含具体错误信息的HTTP 400响应。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。