Spring技巧

springboot @RestControllerAdvice

2022-05-31  本文已影响0人  饱饱抓住了灵感

全局异常处理类

@RestControllerAdvice
public class GlobalExceptionHandleConfig {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(BindException.class)
    public Object bindExceptionHandler(BindException e) {
        logger.error("控制层参数校验失败", e);
        String objectError = e.getBindingResult().getAllErrors().stream().map(ObjectError::getDefaultMessage).filter(ObjectUtil::isNotNull).distinct().collect(Collectors.joining(SignConstant.COMMA));
        return JsonResponse.error(objectError);
    }

    @ExceptionHandler(ConstraintViolationException.class)
    public Object constraintViolationExceptionHandler(ConstraintViolationException e) {
        logger.error("业务层参数校验失败", e);
        Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
        String collectErrorMsg = constraintViolations.stream().map(ConstraintViolation::getMessage).filter(ObjectUtil::isNotNull).distinct().collect(Collectors.joining(", "));
        return JsonResponse.error(collectErrorMsg);
    }

    @ExceptionHandler(Exception.class)
    public Object ExceptionHandler(Exception e) {
        logger.error("大事不好啦,服务器报错了", e);
        return JsonResponse.error(e.getMessage());
    }
}

控制层参数使用@Valid注解开启参数校验

@RestController
@RequestMapping("/person")
public class PersonController {

  @Resource
  private PersonDAO personDAO;

 /**
   * 控制层参数错误会抛出 BindException 
   */
  @RequestMapping("/save")
  public Object save(@Valid PersonDO personDO) {
    return personService.save(personDO);
  }
}

业务类参数也是使用@Valid注解开启参数校验

@Service
public class PersonService {

    @Autowired
    private PersonDAO personDAO;
   
   /**
    * 业务层参数错误会抛出 ConstraintViolationException 
    */
    public PersonDO save(@Valid PersonDO personDO) {
        System.out.println("先打印,再保存");
        personDAO.save(personDO);
        return personDO;
    }
}

实体类添加校验注解

@Entity
@Table(name = "person")
public class PersonDO extends IdEntity {

    @NotNull(message = "人不能没有名字,起个007都行")
    @Column(name = "name")
    @Length(max = 100, message = "名字太长记不住")
    private String name;

    @Min(value = 1, message = "虚岁算法,出生即1岁")
    @Max(value = 200, message = "超越时间的力量")
    @Column(name = "age")
    private Integer age;
    ...
}

更多校验请查看javax.validation.constraints

上一篇 下一篇

猜你喜欢

热点阅读