如果不加异常处理
会出现一堆代码,一点也不友好
"timestamp": "2020-03-19T01:31:15.241+0000",
"status": 500,
"error": "Internal Server Error",
"message": "页码值无效",
"trace": "java.lang.IllegalArgumentException: 页码值无效\r\n\tat org.springframework.util.Assert.isTrue(Assert.java:118)\r\n\tat com.cy.pj.sys.service.impl.SysLogServiceImpl.findPageObjects(SysLogServiceImpl.java:37)\r\n\tat com.cy.pj.sys.controller.SysLogController.doFindObjects(SysLogController.java:33)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.lang.reflect.Method.invoke(Method.java:498)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)\r\n\tat
解决方法之一 —— 在Controller层写一个异常处理方法
/**
* 描述的方法为一个异常处理方法
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
public JsonResult doHandleRuntimeException(RuntimeException e){
e.printStackTrace();
return new JsonResult(e);
}
但是考虑代码复用,首先想到继承,似乎也不好,那么用springboot的@ControllerAdvice
/**
* 统一异常处理类的定义
* @ControllerAdvice描述的类是全局异常处理类
* @author DELL
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/** JDK中的自带的日志API */
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JsonResult doHandleRuntimeException(RuntimeException e){
e.printStackTrace();
return new JsonResult(e);
}
}
打印结果
{
"state": 0,
"message": "页码值无效",
"data": null
}
JsonResult
/**
* 封装控制层方法的返回结果
* @author DELL
*/
@Data
@NoArgsConstructor
public class JsonResult implements Serializable {
/**状态码 1表示SUCCESS,0表示ERROR*/
private int state=1;
/**状态信息*/
private String message="ok";
/**正确数据*/
private Object data;
public JsonResult(String message){
this.message=message;
}
/**一般查询时调用,封装查询结果*/
public JsonResult(Object data) {
this.data=data;
}
/**出现异常时时调用*/
public JsonResult(Throwable t){
this.state=0;
this.message=t.getMessage();
}
}