1、ExceptionHandlerController
package com.oy.controller; import java.text.MessageFormat; import org.springframework.beans.TypeMismatchException; import org.springframework.http.HttpStatus; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MissingServletRequestParameterException; 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 org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException; import com.alibaba.fastjson.JSONObject; import com.oy.exception.ForbiddenException; import com.oy.utils.UtilFunctions; @ControllerAdvice public class ExceptionHandlerController { @ExceptionHandler(RuntimeException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public JSONObject runtimeExceptionHandler(RuntimeException ex) { UtilFunctions.log.error("runtimeExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); response.put("message", "Internal Server Error"); return response; } @ExceptionHandler(NullPointerException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public JSONObject nullPointerExceptionHandler(NullPointerException ex) { UtilFunctions.log.error("nullPointerExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); response.put("message", "Internal Server Error"); return response; } /*----- REQUEST ERROR -----*/ @ExceptionHandler({ ForbiddenException.class }) @ResponseStatus(HttpStatus.FORBIDDEN) @ResponseBody public JSONObject requestForbidden(ForbiddenException ex) { UtilFunctions.log.error("ForbiddenExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); response.put("message", ex.getMessage()); return response; } @ExceptionHandler({ TypeMismatchException.class }) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public JSONObject requestTypeMismatch(TypeMismatchException ex) { UtilFunctions.log.error("TypeMismatchExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); // response.put("message", "Bad Request"); // response.put("message", "Bad Request, parameter type of " + ex.getPropertyName() + " need be " + ex.getRequiredType()); if (Double.class.equals(ex.getRequiredType()) || Integer.class.equals(ex.getRequiredType())) { response.put("message", "Bad Request, " + ex.getValue() + " not a number"); } else { String strTemplate = "Bad Request, {0} is invalid, a type of {1} is needed"; response.put("message", MessageFormat.format(strTemplate, ex.getValue(), ex.getRequiredType().getName())); } return response; } @ExceptionHandler({ MissingServletRequestParameterException.class }) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public JSONObject requestMissingServletRequest(MissingServletRequestParameterException ex) { UtilFunctions.log.error("MissingServletRequestParameterExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); // response.put("message", "Bad Request"); String strTemplate = "Bad Request, param:{0} is required, type:{1}"; response.put("message", MessageFormat.format(strTemplate, ex.getParameterName(), ex.getParameterType())); return response; } @ExceptionHandler({ NoSuchRequestHandlingMethodException.class }) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public JSONObject NoSuchRequestHandlingMethodExceptionHandler(NoSuchRequestHandlingMethodException ex) { UtilFunctions.log.error("NoSuchRequestHandlingMethodExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); response.put("message", "Not Found"); return response; } /*----- REQUEST ERROR -----*/ @ExceptionHandler({ HttpMessageNotReadableException.class }) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public JSONObject requestNotReadable(HttpMessageNotReadableException ex) { UtilFunctions.log.error("HttpMessageNotReadableExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); response.put("message", "Bad Request"); return response; } @ExceptionHandler({ HttpRequestMethodNotSupportedException.class }) @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) @ResponseBody public JSONObject request405(HttpRequestMethodNotSupportedException ex) { UtilFunctions.log.error("HttpRequestMethodNotSupportedExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject(); // response.put("message", "Method Not Allowed"); response.put("message", ex.getMessage()); return response; } }
2、postman測試
3、異常增強類型:
NullPointerException,RunTimeException,ClassCastException,
NoSuchMethodException,IOException,IndexOutOfBoundsException
以及springmvc自定義異常等,如下:
SpringMVC自定義異常 對應的status code
Exception HTTP Status Code
ConversionNotSupportedException 500 (Internal Server Error)
HttpMessageNotWritableException 500 (Internal Server Error)
HttpMediaTypeNotSupportedException 415 (Unsupported Media Type)
HttpMediaTypeNotAcceptableException 406 (Not Acceptable)
HttpRequestMethodNotSupportedException 405 (Method Not Allowed)
NoSuchRequestHandlingMethodException 404 (Not Found)
TypeMismatchException 400 (Bad Request)
HttpMessageNotReadableException 400 (Bad Request)
MissingServletRequestParameterException 400 (Bad Request)
參考資料:
(3)@ControllerAdvice + @ExceptionHandler 全局處理 Controller 層異常
(4)https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ExceptionHandler.html