BaseErrorController.java

  1. package cn.home1.oss.lib.errorhandle.internal;

  2. import cn.home1.oss.lib.errorhandle.api.HttpHeader;
  3. import cn.home1.oss.lib.errorhandle.api.ResolvedError;
  4. import cn.home1.oss.lib.errorhandle.api.StackTraceIndicator;

  5. import lombok.Setter;

  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.autoconfigure.web.ErrorProperties;
  8. import org.springframework.http.HttpStatus;
  9. import org.springframework.http.MediaType;
  10. import org.springframework.http.ResponseEntity;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.util.Assert;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.ResponseBody;
  15. import org.springframework.web.servlet.ModelAndView;

  16. import java.util.Map;

  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;

  19. /**
  20.  * override default BasicErrorController.
  21.  *
  22.  * {@link org.springframework.boot.autoconfigure.web.BasicErrorController}
  23.  *
  24.  * <p>
  25.  * see: ErrorMvcAutoConfiguration, BasicErrorController
  26.  * </p>
  27.  */
  28. @Controller
  29. @RequestMapping("${server.error.path:${error.path:/error}}")
  30. public abstract class BaseErrorController extends org.springframework.boot.autoconfigure.web.AbstractErrorController {

  31.   private final ErrorProperties errorProperties;

  32.   @Autowired
  33.   @Setter
  34.   private StackTraceIndicator traceIndicator;

  35.   protected BaseErrorController( //
  36.     final ExtendedErrorAttributes errorAttributes, //
  37.     final ErrorProperties errorProperties //
  38.   ) {
  39.     super(errorAttributes);
  40.     Assert.notNull(errorProperties, "AppErrorProperties must not be null");
  41.     this.errorProperties = errorProperties;
  42.   }

  43.   protected ModelAndView errorHtml( //
  44.     final HttpServletRequest request, //
  45.     final HttpServletResponse response //
  46.   ) {
  47.     final Map<String, Object> errorAttributes = getErrorAttributes( //
  48.       request, //
  49.       isIncludeStackTrace(request, MediaType.TEXT_HTML) //
  50.     );
  51.     final ResolvedError resolvedError = ResolvedError.fromErrorAttributes(errorAttributes);
  52.     final Integer status = resolvedError.getStatus();// this.getStatus(request)
  53.     response.setStatus(status);
  54.     // goto WhitelabelErrorViewConfiguration.defaultErrorView if not provided.
  55.     final ModelAndView mav = new ModelAndView("error", resolvedError.toErrorAttributes());
  56.     mav.addObject(ResolvedError.RESOLVED_ERROR_OBJECT, resolvedError);
  57.     return mav;
  58.   }

  59.   protected ResponseEntity<ResolvedError> error(final HttpServletRequest request, final HttpServletResponse response) {
  60.     final Map<String, Object> errorAttributes = getErrorAttributes( //
  61.       request, //
  62.       isIncludeStackTrace(request, MediaType.ALL) //
  63.     );
  64.     final ResolvedError body = ResolvedError.fromErrorAttributes(errorAttributes);
  65.     final HttpStatus status = body.getHttpStatus();// this.getStatus(request);
  66.     copyHeaders(body, response);
  67.     return new ResponseEntity<>(body, status);
  68.   }

  69.   /**
  70.    * copy ResolvedErrorçš„header到response.
  71.    *
  72.    * @param source   source
  73.    * @param response response
  74.    */
  75.   private void copyHeaders(final ResolvedError source, final HttpServletResponse response) {
  76.     if (source != null && source.getHeaders() != null) {
  77.       for (final HttpHeader header : source.getHeaders()) {
  78.         for (final String value : header.getValues()) {
  79.           response.addHeader(header.getName(), value);
  80.         }
  81.       }
  82.     }
  83.   }

  84.   protected boolean isIncludeStackTrace(final HttpServletRequest request, final MediaType produces) {
  85.     return this.traceIndicator.stackTrace(request, null);
  86.   }

  87.   @Override
  88.   public String getErrorPath() {
  89.     return this.errorProperties.getPath();
  90.   }

  91.   public static class RestfulErrorController extends BaseErrorController {

  92.     public RestfulErrorController( //
  93.       final ExtendedErrorAttributes errorAttributes, //
  94.       final ErrorProperties errorProperties //
  95.     ) {
  96.       super(errorAttributes, errorProperties);
  97.     }

  98.     @RequestMapping
  99.     @ResponseBody
  100.     public ResponseEntity<ResolvedError> error(final HttpServletRequest request, final HttpServletResponse response) {
  101.       return super.error(request, response);
  102.     }
  103.   }

  104.   public static class TemplateErrorController extends BaseErrorController {

  105.     public TemplateErrorController( //
  106.       final ExtendedErrorAttributes errorAttributes, //
  107.       final ErrorProperties errorProperties //
  108.     ) {
  109.       super(errorAttributes, errorProperties);
  110.     }

  111.     @RequestMapping
  112.     public ModelAndView errorHtml( //
  113.       final HttpServletRequest request, //
  114.       final HttpServletResponse response //
  115.     ) {
  116.       return super.errorHtml(request, response);
  117.     }
  118.   }

  119.   public static class MixedErrorController extends BaseErrorController {

  120.     public MixedErrorController( //
  121.       final ExtendedErrorAttributes errorAttributes, //
  122.       final ErrorProperties errorProperties //
  123.     ) {
  124.       super(errorAttributes, errorProperties);
  125.     }

  126.     @RequestMapping(produces = "text/html")
  127.     public ModelAndView errorHtml( //
  128.       final HttpServletRequest request, //
  129.       final HttpServletResponse response //
  130.     ) {
  131.       return super.errorHtml(request, response);
  132.     }

  133.     @RequestMapping
  134.     @ResponseBody
  135.     public ResponseEntity<ResolvedError> error(final HttpServletRequest request, final HttpServletResponse response) {
  136.       return super.error(request, response);
  137.     }
  138.   }
  139. }