直接工具类,spring自动捕获异常
package com.******;
import com.google.common.base.Joiner;
import com.joysuch.hospital.controller.dto.ErrorMsg;
import com.joysuch.hospital.exception.OpenApiException;
import com.joysuch.hospital.exception.RequestParamException;
import com.joysuch.hospital.exception.ResourceNotFoundException;
import com.joysuch.hospital.exception.UnauthorizedException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
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 javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author system
*
*/
@ResponseBody
@ControllerAdvice
@Slf4j
public class CommonExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(ResourceNotFoundException.class)
public ErrorMsg handleResourceNotFoundException(HttpServletRequest request, ResourceNotFoundException e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
return new ErrorMsg(e.getMessage());
}
@ResponseStatus(HttpStatus.UNAUTHORIZED)
@ExceptionHandler(UnauthorizedException.class)
public ErrorMsg handleUnauthorizedException(HttpServletRequest request, UnauthorizedException e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
return new ErrorMsg(e.getMessage());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(RequestParamException.class)
public ErrorMsg handleRequestParamException(HttpServletRequest request, RequestParamException e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
return new ErrorMsg(e.getMessage());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ErrorMsg handleMethodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
Set<String> collect = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toSet());
return new ErrorMsg(Joiner.on(",").join(collect));
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ErrorMsg handleHttpMessageNotReadableException(HttpServletRequest request, HttpMessageNotReadableException e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
Throwable mostSpecificCause = e.getMostSpecificCause();
String exceptionName = mostSpecificCause.getClass().getName();
String message = mostSpecificCause.getMessage();
return new ErrorMsg(exceptionName + message);
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(BindException.class)
public ErrorMsg handleBindException(HttpServletRequest request, BindException e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
Set<String> collect = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toSet());
return new ErrorMsg(Joiner.on(",").join(collect));
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(OpenApiException.class)
public ErrorMsg handleOpenApiException(HttpServletRequest request, OpenApiException e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
return new ErrorMsg(e.getMessage());
}
// @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
// @ExceptionHandler(RuntimeException.class)
// public ErrorMsg handleOpenApiException(HttpServletRequest request, RuntimeException e) {
// log.error("请求" + request.getRequestURL() + "执行异常:", e);
// return new ErrorMsg(e.getMessage());
// }
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ErrorMsg handleException(HttpServletRequest request, Exception e) {
log.error("请求" + request.getRequestURL() + "执行异常:", e);
return new ErrorMsg("操作失败,请稍后重试");
}
}
controller继承类,继承之后可以获取异常
package com.***********;
import com.google.common.base.Joiner;
import com.ipzoe.bc.server.joysuch.core.exception.ErrorEnum;
import com.ipzoe.bc.server.joysuch.core.exception.OpenApiException;
import com.ipzoe.bc.server.joysuch.core.exception.RequestParamException;
import com.ipzoe.component.common.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author system
*
*/
@Slf4j
public class JSBaseController {
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(RequestParamException.class)
public Result<Void> handleRequestParamException(HttpServletRequest request, RequestParamException e) {
return Result.wrapErrorResult(ErrorEnum.ERROR_PARAM.getErrorCode(), e.getMessage());
}
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(OpenApiException.class)
public Result<Void> handleRequestParamException(HttpServletRequest request, OpenApiException e) {
return Result.wrapErrorResult(ErrorEnum.ERROR_PARAM.getErrorCode(), e.getMessage());
}
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(Exception.class)
public Result<Void> handleException(HttpServletRequest request, Exception e) {
return Result.wrapErrorResult(ErrorEnum.ERROR_DEFAULT.getErrorCode(), e.getMessage());
}
protected void checkReqParams(BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
List<ObjectError> allErrors = bindingResult.getAllErrors();
List<String> collect = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList());
throw new RequestParamException(Joiner.on("; ").join(collect));
}
}
}