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包