一、页面的形式返回
直接在resources的目录下创建public/error的路径,然后创建5xx.html或者4xx.html文件,如果出错就会自动跳转的相应的页面。
二、cotroller的形式返回错误的处理
1.自定义错误处理类
package com.kiyozawa.manager.error; import org.springframework.boot.autoconfigure.web.ErrorProperties; import org.springframework.boot.autoconfigure.web.*; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Map; /** * 自定义错误处理 */ public class MyErrorController extends BasicErrorController { public MyErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List<ErrorViewResolver> errorViewResolvers) { super(errorAttributes, errorProperties, errorViewResolvers); } // { // "timestamp": "2019-03-02 13:19:46.066", // x "status": 500, // x"error": "Internal Server Error", // x "exception": "java.lang.IllegalArgumentException", // "message": "编号不可为空", // x "path": "/manager/products" // } @Override protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) { Map<String, Object> attrs = super.getErrorAttributes(request, includeStackTrace); //去除返回值中不必要的信息 attrs.remove("timestamp"); attrs.remove("status"); attrs.remove("error"); attrs.remove("exception"); attrs.remove("path"); //通过信息获取errorCode的值,最终获取errorEnum类的信息 String errorCode = (String) attrs.get("message"); ErrorEnum errorEnum = ErrorEnum.getByCode(errorCode); //ErrorEnum类的信息存入attrs中返回给前端 attrs.put("message",errorEnum.getMessage()); attrs.put("code",errorEnum.getCode()); attrs.put("canRetry",errorEnum.isCanRetry()); return attrs; } }
把错误处理类自动配置到Springboot中
package com.kiyozawa.manager.error; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.web.ErrorAttributes; import org.springframework.boot.autoconfigure.web.ErrorViewResolver; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; @Configuration public class ErrorConfiguration { @Bean public MyErrorController basicErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties, ObjectProvider<List<ErrorViewResolver>> errorViewResolversProvider) { return new MyErrorController(errorAttributes, serverProperties.getError(), errorViewResolversProvider.getIfAvailable()); } }
自定义错误类型
package com.kiyozawa.manager.error; public enum ErrorEnum { ID_NoT_NULL("F001","编码不为空",false), UNKOWN("000","位置异常",false); private String code; private String message; private boolean canRetry; ErrorEnum(String code,String message,boolean canRetry){ this.code=code; this.message=message; this.canRetry=canRetry; } public static ErrorEnum getByCode(String code){ for (ErrorEnum errorEnum:ErrorEnum.values()){ if(errorEnum.code.equals(code)){ return errorEnum; } } return UNKOWN; } public String getCode() { return code; } public String getMessage() { return message; } public boolean isCanRetry() { return canRetry; } }
另外的一种方式见下:
package com.kiyozawa.manager.error; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import java.util.HashMap; import java.util.Map; /** * 统一错误处理 */
//路径为controller类的路径
@ControllerAdvice(basePackages = {"com.kiyozawa.manager.controller"}) public class ErrorControllerAdvice { @ExceptionHandler(Exception.class) @ResponseBody public ResponseEntity handleException(Exception e){ Map<String, Object> attrs = new HashMap(); String errorCode = e.getMessage(); ErrorEnum errorEnum = ErrorEnum.getByCode(errorCode); attrs.put("message",errorEnum.getMessage()); attrs.put("code",errorEnum.getCode()); attrs.put("canRetry",errorEnum.isCanRetry()); attrs.put("type","advice"); // Assert.isNull(attrs,"advice"); return new ResponseEntity(attrs, HttpStatus.INTERNAL_SERVER_ERROR); } }