SpringBoot的默認異常處理映射為“/error”。BasicErrorController已經默認實現了“text/html”的處理,如果想返回自定義JSON格式信息,則實現“ErrorController ”接口,增加一個produces 為“application/json”的方法即可,如:
@RestController public class ExceptionController implements ErrorController { @Autowired private ErrorAttributes errorAttributes; /** * 默認錯誤 */ private static final String path_default = "/error"; @Override public String getErrorPath() { return path_default; } /** * JSON格式錯誤信息 */ @RequestMapping(value = path_default, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseMessage error(HttpServletRequest request) { RequestAttributes requestAttributes = new ServletRequestAttributes(request); Map<String, Object> body = this.errorAttributes.getErrorAttributes(requestAttributes, true); return ResponseMessage.fail("服務器端異常!", body); } }
ResponseMessage 為自定義的實體類,用於向前端返回統一格式信息,結構如:
public class ResponseMessage { /** * 是否成功 */ private boolean success; /** * 返回文字 */ private String msg; /** * 返回數據 */ private Object data; public ResponseMessage() { } public ResponseMessage(boolean success, String msg, Object data) { this.success = success; this.msg = msg; this.data = data; } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public static ResponseMessage success(){ return new ResponseMessage(true, null, null); } /** * 成功返回方法 * @param data 返回數據 */ public static ResponseMessage success(Object data){ return new ResponseMessage(true, null, data); } /** * 失敗返回方法--默認 */ public static ResponseMessage fail(){ return new ResponseMessage(false, null, null); } /** * 失敗返回方法 * @param message 文字信息 */ public static ResponseMessage fail(String message){ return new ResponseMessage(false, message, null); } /** * 失敗返回方法 * @param message 文字信息 * @param data 數據 */ public static ResponseMessage fail(String message, Object data){ return new ResponseMessage(false, message, data); } }
開發者可以根據實際業務進行擴展次實體類,如增加時間戳、錯誤碼等信息