Swagger2+@Validated全局异常捕捉

需求背景:

  • 之前写一些参数校验都是手动操作的,深感太low。想找一款校验组建减少一些低级代码的编写,还要简单易用

结论:

  • 使用Spring提供的@Validated注解开启校验,搭配Hibernate或者java注解。
  • 使用@RestControllerAdvice进行全局异常捕捉,并进行封装(代码中BindingResult的用法实在丑陋)

问题:

  • 测了一把发现Swagger2在方法上面直接加参数会变成body类型。页面上调用不了,扎心!还好@RequestParam注解化解了尴尬
  • 复杂场景可能会用到Group,可百度其他博客处理

 

代码:

  • 引包
    • 
          io.springfox
          springfox-swagger2
          2.9.2
      
      
          io.springfox
          springfox-swagger-ui
          2.9.2
      
      
      
          org.projectlombok
          lombok
          1.18.8
      
  • 异常拦截
    • package com.qc.study.controller;
      
      import org.springframework.validation.BindException;
      import org.springframework.web.bind.annotation.ExceptionHandler;
      import org.springframework.web.bind.annotation.RestControllerAdvice;
      
      import javax.validation.ConstraintViolationException;
      
      /**
       * @author qucheng 
       */
      @RestControllerAdvice
      public class ErrorController {
          /**
           * body参数
           * @param e BindException
           */
          @ExceptionHandler(BindException.class)
          public String handler3(BindException e) {
              StringBuilder msg = new StringBuilder();
              e.getBindingResult().getFieldErrors().forEach(c ->
                      msg.append(c.getField()).append(":").append(c.getDefaultMessage()).append(">"));
              return msg.substring(0, msg.length() - 1);
          }
      
          /**
           * 方法参数
           * @param e ConstraintViolationException
           */
          @ExceptionHandler(ConstraintViolationException.class)
          public String handler2(ConstraintViolationException e) {
              StringBuilder msg = new StringBuilder();
              e.getConstraintViolations().forEach(c ->
                      msg.append(c.getMessage()).append(":").append(c.getInvalidValue()).append(">"));
              return msg.substring(0, msg.length() - 1);
          }
      
      }
  • Swagger2简陋配置
    • package com.qc.study.config;
      
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.bind.annotation.RestController;
      import springfox.documentation.builders.ApiInfoBuilder;
      import springfox.documentation.builders.RequestHandlerSelectors;
      import springfox.documentation.service.ApiInfo;
      import springfox.documentation.spi.DocumentationType;
      import springfox.documentation.spring.web.plugins.Docket;
      import springfox.documentation.swagger2.annotations.EnableSwagger2;
      
      /**
       * @author QuCheng on 2020/6/30.
       */
      @Configuration
      @EnableSwagger2
      public class SwaggerConfig {
          @Bean
          public Docket productApi() {
              return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                      .select().apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                      .build();
          }
      
          private ApiInfo apiInfo() {
              return new ApiInfoBuilder().title("xxx接口").version("Final").build();
          }
      }
  • Controller + Bean

    • package com.qc.study.controller;
      
      import com.qc.study.bean.U;
      import io.swagger.annotations.Api;
      import io.swagger.annotations.ApiOperation;
      import org.hibernate.validator.constraints.Length;
      import org.springframework.validation.annotation.Validated;
      import org.springframework.web.bind.annotation.*;
      
      import javax.validation.constraints.Min;
      import javax.validation.constraints.NotBlank;
      import javax.validation.constraints.NotNull;
      
      /**
       * @author QuCheng on 2020/6/30.
       */
      @RestController
      @RequestMapping("vv")
      @Validated
      @Api(tags = "xixixxx")
      public class ValidateT {
      
          @ApiOperation("获取用户信息")
          @GetMapping("/u1")
          public String getUser(@RequestParam @NotBlank @Length(max = 10, message = "用户名太长") String username,
                                @RequestParam @NotNull @Min(value = 1, message = "无效的用户id") Long userId) {
              return "user";
          }
      
          @ApiOperation("获取用户信息1")
          @PostMapping("/u2")
          public String getUser1(U u) {
              return "user";
          }
      
          @ApiOperation("获取用户信息2")
          @PostMapping("/u3")
          public String getUser2(@Validated U u) {
              return "user";
          }
      }
      
      
      package com.qc.study.bean;
      
      import lombok.Data;
      import org.hibernate.validator.constraints.Range;
      
      import javax.validation.constraints.Size;
      
      /**
       * @author QuCheng on 2020/6/30.
       */
      @Data
      public class U {
      
          @Size(min = 1, max = 10, message = "名称长度在1-10")
          private String name;
      
          @Range(min = 10, max = 25, message = "年龄在10-25岁")
          private Integer age;
      }

       

       

 

你可能感兴趣的:(Swagger2+@Validated全局异常捕捉)