真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot如何實(shí)現(xiàn)統(tǒng)一異常處理

這篇文章將為大家詳細(xì)講解有關(guān)SpringBoot如何實(shí)現(xiàn)統(tǒng)一異常處理,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

游仙網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

1.介紹

在日常開(kāi)發(fā)中發(fā)生了異常,往往是需要通過(guò)一個(gè)統(tǒng)一的異常處理處理所有異常,來(lái)保證客戶端能夠收到友好的提示。SpringBoot在頁(yè)面發(fā)生異常的時(shí)候會(huì)自動(dòng)把請(qǐng)求轉(zhuǎn)到/error,SpringBoot內(nèi)置了一個(gè)BasicErrorController對(duì)異常進(jìn)行統(tǒng)一的處理,當(dāng)然也可以自定義這個(gè)路徑

application.yaml

server:
 port: 8080
 error:
 path: /custom/error

BasicErrorController提供兩種返回錯(cuò)誤一種是頁(yè)面返回、當(dāng)你是頁(yè)面請(qǐng)求的時(shí)候就會(huì)返回頁(yè)面,另外一種是json請(qǐng)求的時(shí)候就會(huì)返回json錯(cuò)誤

 @RequestMapping(produces = "text/html")
 public ModelAndView errorHtml(HttpServletRequest request,
   HttpServletResponse response) {
  HttpStatus status = getStatus(request);
  Map model = Collections.unmodifiableMap(getErrorAttributes(
    request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
  response.setStatus(status.value());
  ModelAndView modelAndView = resolveErrorView(request, response, status, model);
  return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
 }

 @RequestMapping
 @ResponseBody
 public ResponseEntity> error(HttpServletRequest request) {
  Map body = getErrorAttributes(request,
    isIncludeStackTrace(request, MediaType.ALL));
  HttpStatus status = getStatus(request);
  return new ResponseEntity>(body, status);
 }

分別會(huì)有如下兩種返回

SpringBoot如何實(shí)現(xiàn)統(tǒng)一異常處理

{
 "timestamp": 1478571808052,
 "status": 404,
 "error": "Not Found",
 "message": "No message available",
 "path": "/rpc"
}

2.通用Exception處理

通過(guò)使用@ControllerAdvice來(lái)進(jìn)行統(tǒng)一異常處理,@ExceptionHandler(value = Exception.class)來(lái)指定捕獲的異常

下面針對(duì)兩種異常進(jìn)行了特殊處理分別返回頁(yè)面和json數(shù)據(jù),使用這種方式有個(gè)局限,無(wú)法根據(jù)不同的頭部返回不同的數(shù)據(jù)格式,而且無(wú)法針對(duì)404、403等多種狀態(tài)進(jìn)行處理

 @ControllerAdvice
 public class GlobalExceptionHandler {
  public static final String DEFAULT_ERROR_VIEW = "error";
  @ExceptionHandler(value = CustomException.class)
  @ResponseBody
  public ResponseEntity defaultErrorHandler(HttpServletRequest req, CustomException e) throws Exception {
   return ResponseEntity.ok("ok");
  }
  @ExceptionHandler(value = Exception.class)
  public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
   ModelAndView mav = new ModelAndView();
   mav.addObject("exception", e);
   mav.addObject("url", req.getRequestURL());
   mav.setViewName(DEFAULT_ERROR_VIEW);
   return mav;
  }
 }

3.自定義BasicErrorController 錯(cuò)誤處理

在初始介紹哪里提到了BasicErrorController,這個(gè)是SpringBoot的默認(rèn)錯(cuò)誤處理,也是一種全局處理方式。咱們可以模仿這種處理方式自定義自己的全局錯(cuò)誤處理

下面定義了一個(gè)自己的BasicErrorController,可以根據(jù)自己的需求自定義errorHtml()和error()的返回值。

 @Controller
 @RequestMapping("${server.error.path:${error.path:/error}}")
 public class BasicErrorController extends AbstractErrorController {
  private final ErrorProperties errorProperties;
  private static final Logger LOGGER = LoggerFactory.getLogger(BasicErrorController.class);
  @Autowired
  private ApplicationContext applicationContext;

  /**
   * Create a new {@link org.springframework.boot.autoconfigure.web.BasicErrorController} instance.
   *
   * @param errorAttributes the error attributes
   * @param errorProperties configuration properties
   */
  public BasicErrorController(ErrorAttributes errorAttributes,
         ErrorProperties errorProperties) {
   this(errorAttributes, errorProperties,
     Collections.emptyList());
  }

  /**
   * Create a new {@link org.springframework.boot.autoconfigure.web.BasicErrorController} instance.
   *
   * @param errorAttributes the error attributes
   * @param errorProperties configuration properties
   * @param errorViewResolvers error view resolvers
   */
  public BasicErrorController(ErrorAttributes errorAttributes,
         ErrorProperties errorProperties, List errorViewResolvers) {
   super(errorAttributes, errorViewResolvers);
   Assert.notNull(errorProperties, "ErrorProperties must not be null");
   this.errorProperties = errorProperties;
  }

  @Override
  public String getErrorPath() {
   return this.errorProperties.getPath();
  }

  @RequestMapping(produces = "text/html")
  public ModelAndView errorHtml(HttpServletRequest request,
          HttpServletResponse response) {
   HttpStatus status = getStatus(request);
   Map model = Collections.unmodifiableMap(getErrorAttributes(
     request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
   response.setStatus(status.value());
   ModelAndView modelAndView = resolveErrorView(request, response, status, model);
   insertError(request);
   return modelAndView == null ? new ModelAndView("error", model) : modelAndView;
  }



  @RequestMapping
  @ResponseBody
  public ResponseEntity> error(HttpServletRequest request) {
   Map body = getErrorAttributes(request,
     isIncludeStackTrace(request, MediaType.ALL));
   HttpStatus status = getStatus(request);
   insertError(request);
   return new ResponseEntity(body, status);
  }

  /**
   * Determine if the stacktrace attribute should be included.
   *
   * @param request the source request
   * @param produces the media type produced (or {@code MediaType.ALL})
   * @return if the stacktrace attribute should be included
   */
  protected boolean isIncludeStackTrace(HttpServletRequest request,
            MediaType produces) {
   ErrorProperties.IncludeStacktrace include = getErrorProperties().getIncludeStacktrace();
   if (include == ErrorProperties.IncludeStacktrace.ALWAYS) {
    return true;
   }
   if (include == ErrorProperties.IncludeStacktrace.ON_TRACE_PARAM) {
    return getTraceParameter(request);
   }
   return false;
  }

  /**
   * Provide access to the error properties.
   *
   * @return the error properties
   */
  protected ErrorProperties getErrorProperties() {
   return this.errorProperties;
  }
 }

SpringBoot提供了一種特殊的Bean定義方式,可以讓我們?nèi)菀椎母采w已經(jīng)定義好的Controller,原生的BasicErrorController是定義在ErrorMvcAutoConfiguration中的

具體代碼如下:

 @Bean
 @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
 public BasicErrorController basicErrorController(ErrorAttributes errorAttributes) {
  return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
    this.errorViewResolvers);
 }

可以看到這個(gè)注解@ConditionalOnMissingBean 意思就是定義這個(gè)bean 當(dāng) ErrorController.class 這個(gè)沒(méi)有定義的時(shí)候, 意思就是說(shuō)只要我們?cè)诖a里面定義了自己的ErrorController.class時(shí),這段代碼就不生效了,具體自定義如下:

 @Configuration
 @ConditionalOnWebApplication
 @ConditionalOnClass({Servlet.class, DispatcherServlet.class})
 @AutoConfigureBefore(WebMvcAutoConfiguration.class)
 @EnableConfigurationProperties(ResourceProperties.class)
 public class ConfigSpringboot {
  @Autowired(required = false)
  private List errorViewResolvers;
  private final ServerProperties serverProperties;

  public ConfigSpringboot(
    ServerProperties serverProperties) {
   this.serverProperties = serverProperties;
  }

  @Bean
  public MyBasicErrorController basicErrorController(ErrorAttributes errorAttributes) {
   return new MyBasicErrorController(errorAttributes, this.serverProperties.getError(),
     this.errorViewResolvers);
  }
 }

在使用的時(shí)候需要注意MyBasicErrorController不能被自定義掃描Controller掃描到,否則無(wú)法啟動(dòng)。

3.總結(jié)

一般來(lái)說(shuō)自定義BasicErrorController這種方式比較實(shí)用,因?yàn)榭梢酝ㄟ^(guò)不同的頭部返回不同的數(shù)據(jù)格式,在配置上稍微復(fù)雜一些,但是從實(shí)用的角度來(lái)說(shuō)比較方便而且可以定義通用組件

關(guān)于SpringBoot如何實(shí)現(xiàn)統(tǒng)一異常處理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


分享題目:SpringBoot如何實(shí)現(xiàn)統(tǒng)一異常處理
URL鏈接:http://weahome.cn/article/iephog.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部