springboot 参数校验使用

1. 引用校验jar包
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
<!--            <version>2.3.3.RELEASE</version>-->
</dependency>
2. 接收参数的Vo类引用
@Data
public class DemoVo {
    @NotNull(message = "demo 的 ID 参数有误")
    private Integer id;
    @NotBlank(message = "名称不能为空")
    private String name;
    @Valid
    @NotNull(message = "至少有一个用户")
    private List<UserVo> userVoList;
}

需要校验当前实例内部属性时,需要使用@Valid注解标记。

3. 在Controller中使用
@ApiOperation("测试运行")
@PostMapping("/demo")
public String test(@Validated @RequestBody DemoVo demoVo) {
System.out.println(JSON.toJSONString(demoVo));
return JSON.toJSONString(demoVo);
}

在参数的注解前加上spring的@Validated注解或者javax的@Valid注解,@RequestBody注解是Post请求专用,get请求也能使用校验,但是不能带@RequestBody注解,而且路径上的参数需要单独接收,

@GetMapping("/get-demo/{id}")
public String testGet( @PathVariable("id") int id,@Valid UserVo userVo)

在get请求体中的参数同样能使用对应的校验规则。

4. 定义校验结果的异常处理类
@RestControllerAdvice
@Order(-999)
public class ParamExceptionHandler {
    /**
     * post参数校验返回的异常
     * @param ex post参数校验异常
     * @return ResultDto
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResultDto exceptionHandler(MethodArgumentNotValidException ex) {
        return getResultDto(ex.getBindingResult());
    }

    private ResultDto getResultDto(BindingResult bindingResult) {
        List<ObjectError> errorList = bindingResult.getAllErrors();
        if (CollectionUtils.isEmpty(errorList)) {
            return new ResultDto(ErrorCode.SYSTEM_ERROR);
        }
        ObjectError objectError = errorList.get(0);
        String field;
        if (objectError instanceof FieldError) {
            FieldError fieldError = (FieldError) objectError;
            field = fieldError.getField();
        } else {
            field = objectError.getObjectName();
        }
        String eMsg = objectError.getDefaultMessage();
        return new ResultDto(ErrorCode.PARAM_ERROR, field, eMsg);
    }

    /**
     * get请求参数校验返回的异常
     * @param ex get请求参数校验异常
     * @return ResultDto
     */
    @ExceptionHandler(BindException.class)
    public ResultDto exceptionHandler(BindException ex) {
        return getResultDto(ex.getBindingResult());
    }
}

这里建议自定义一个返回结果类ResultDto,定义一个结果码枚举类ErrorCode。

5. 关闭springboot的自动处理异常
#出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
6. swagger页面异常无法使用

步骤五之后莫名其妙的swagger就无法打开了,网上查询得到的原因是步骤五配置后DispatcherServlet只会直接匹配对应路径的Controller,所以需要把相应的路径配置指定的资源:

@Configuration
public class BaoYongMvcConfigurationSupport extends WebMvcConfigurationSupport {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations(
                "classpath:/static/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
                "classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
        super.addResourceHandlers(registry);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值