1.@RestControllerAdvice注解定义全局处理异常类,异常处理类于@ControllerAdvice相比不需要添加@ResponseBody就可以返回JSON格式异常,
@Target()
@Retention()
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<?>[] assignableTypes() default {};
Class<? extends Annotation>[] annotations() default {};
}
- 该注解被@ControllerAdvice和@ResponseBody声明,作用相当于@ExceptionHandler标注的异常处理方法同时也被@ResponseBody注解声明,返回JSON数据
- 可以指定异常处理要扫描的包,如@RestControllerAdvice(basePackages=“”)}、@RestControllerAdvice(“”)
2.@ExceptionHandler注解声明处理具体异常的方法;
@Target()
@Retention()
@Documented
public @interface ExceptionHandler {
/**
* 异常处理方法将会处理参数指定的异常类,如果为空,将会默认处理方法参数指定的任何异常类
*/
Class<? extends Throwable>[] value() default {};
}
- 用于处理特定处理程序类或者方法的注解
3.控制器异常处理实现类
package ;
import ;
import ;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Description: 控制并统一处理异常类
* @ExceptionHandler标注的方法优先级问题,它会找到异常的最近继承关系,也就是继承关系最浅的注解方法
* @Version: 1.0
*/
@RestControllerAdvice
public final class ExceptionAdviceHandler {
private ObjectError objectError;
/**
* 未知异常
*/
@ExceptionHandler(value = )
public BaseResponse unKnowExceptionHandler(Exception e) {
();
StackTraceElement[] elements = ();
String message = ;
if( > 0){
StackTraceElement element = elements[0];
message = ("控制器", (), ".", (), "类的第", (), "行发生", (), "异常");
}
if((message)){
message = ();
}
return (HttpStatus.UNKNOW_EXCEPTION.getStatus(), message);
}
/**
* 运行时异常
*/
@ExceptionHandler(value = )
public BaseResponse runtimeExceptionHandler(RuntimeException e) {
();
StackTraceElement[] elements = ();
String message = ;
if( > 0){
StackTraceElement element = elements[0];
message = ("控制器", (), ".", (), "类的第", (), "行发生", (), "异常");
}
if((message)){
message = ();
}
return (HttpStatus.RUNTIME_EXCEPTION.getStatus(), message);
}
/**
* 空指针异常
*/
@ExceptionHandler()
public BaseResponse nullPointerExceptionHandler(NullPointerException e) {
();
StackTraceElement[] elements = ();
String message = ;
if( > 0){
StackTraceElement element = elements[0];
message = ("控制器", (), ".", (), "类的第", (), "行发生", (), "异常");
}
if((message)){
message = ();
}
return (HttpStatus.NULL_POINTER_EXCEPTION.getStatus(), message);
}
/**
* 类型转换异常
*/
@ExceptionHandler()
public BaseResponse classCastExceptionHandler(ClassCastException e) {
();
StackTraceElement[] elements = ();
String message = ;
if( > 0){
StackTraceElement element = elements[0];
message = ("控制器", (), ".", (), "类的第", (), "行发生", (), "异常");
}
if((message)){
message = ();
}
return (HttpStatus.CLASS_CAST_EXCEPTION.getStatus(), message);
}
/**
* IO异常
*/
@ExceptionHandler()
public BaseResponse iOExceptionHandler(IOException e) {
();
StackTraceElement[] elements = ();
String message = ;
if( > 0){
StackTraceElement element = elements[0];
message = ("控制器", (), ".", (), "类的第", (), "行发生", (), "异常");
}
if((message)){
message = ();
}
return (HttpStatus.IO_EXCEPTION.getStatus(), message);
}
/**
* 数组越界异常
*/
@ExceptionHandler()
@ResponseStatus(.INTERNAL_SERVER_ERROR)
public BaseResponse indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException e) {
();
StackTraceElement[] elements = ();
String message = ;
if( > 0){
StackTraceElement element = elements[0];
message = ("控制器", (), ".", (), "类的第", (), "行发生", (), "异常");
}
if((message)){
message = ();
}
return (HttpStatus.INDEX_OUTOF_BOUNDS_EXCEPTION.getStatus(), message);
}
/**
* 参数类型不匹配
*/
@ExceptionHandler({})
public BaseResponse requestTypeMismatch(MethodArgumentTypeMismatchException e){
return (HttpStatus.METHOD_ARGUMENT_TYPE_MISMATCH_EXCEPTIION.getStatus(), "参数类型不匹配,参数"+()+"类型必须为"+());
}
/**
* 缺少参数
*/
@ExceptionHandler({})
public BaseResponse requestMissingServletRequest(MissingServletRequestParameterException e) {
return (HttpStatus.MISSING_SERVLET_REQUEST_PARAMETER_EXCEPTION.getStatus(), "缺少必要参数,参数名称为"+());
}
/**
* 请求method不匹配
*/
@ExceptionHandler({})
public BaseResponse requestMissingServletRequest(HttpRequestMethodNotSupportedException e) {
return (HttpStatus.HTTP_REQUEST_METHOD_NOT_SUPPORTED_EXCEPTION.getStatus(), "不支持"+()+"方法,支持"+ ((), ",")+"类型");
}
/**
*
* 控制器方法中@RequestBody类型参数数据类型转换异常
*/
@ExceptionHandler({})
public BaseResponse httpMessageNotReadableException(HttpMessageNotReadableException e, WebRequest wq){
();
Throwable throwable = ();
return (HttpStatus.PARAM_EXCEPTION.getStatus(), ());
}
/**
*
* 控制器方法参数异常
*/
@ExceptionHandler({})
public BaseResponse methodArgumentNotValidException(MethodArgumentNotValidException e){
();
BindingResult bindingResult = ();
FieldError fieldError = ();
String message = (());
return (HttpStatus.PARAM_EXCEPTION.getStatus(), message);
}
}
GitHub源码:/mingyang66/spring-parent/tree/master/spring-boot-control-exception-service