package com..web.advice;
import com.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Iterator;
import java.util.Set;
@ControllerAdvice(basePackages = {"com.web"})
@Slf4j
public class WebControllerAdvice {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
JsonResult handlerMethodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException exception) {
log.error("Controller MethodArgumentNotValidException-Path:[{}],refer:{}", request.getRequestURI(), request.getHeader("referer"), exception);
return getBindingResultErrorMessage(exception.getBindingResult());
}
@ExceptionHandler(BindException.class)
@ResponseBody
public JsonResult handleMethodBindException(HttpServletRequest request, BindException e) {
log.error("Controller BindException-Path:{},refer:{}", request.getRequestURI(), request.getHeader("referer"));
return getBindingResultErrorMessage(e.getBindingResult());
}
private JsonResult getBindingResultErrorMessage(BindingResult bindingResult2) {
final BindingResult bindingResult = bindingResult2;
return JsonResult.fail("500", bindingResult.getAllErrors().get(0).getDefaultMessage());
}
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
JsonResult handlerConstraintViolationException(HttpServletRequest request, ConstraintViolationException exception) {
log.error("Controller ConstraintViolationException-Path:[{}]", request.getRequestURI(), exception);
Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
final Iterator<ConstraintViolation<?>> constraintViolationIterator = constraintViolations.iterator();
if (constraintViolationIterator.hasNext()) {
ConstraintViolation<?> constraintViolation = constraintViolationIterator.next();
return JsonResult.fail("500", constraintViolation.getMessage());
}
return JsonResult.fail("500", "参数异常");
}
@ExceptionHandler(ServiceException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
JsonResult handleControllerServiceException(HttpServletRequest request, Throwable th) {
ServiceException exception = (ServiceException) th;
log.error("Controller ServiceException-Path:[{}]", request.getRequestURI(), th);
return JsonResult.fail(exception.getCode(), exception.getMessage());
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
JsonResult handleControllerException(HttpServletRequest request, Throwable th) {
HttpStatus status = getStatus(request);
log.error("Controller Path: [{}]", request.getRequestURI(), th);
return JsonResult.fail(status.toString(), "系统错误");
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}