最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot錯誤處理機(jī)制以及自定義異常處理詳解

 更新時間:2019年05月06日 11:46:09   作者:不清不慎  
這篇文章主要為大家詳細(xì)介紹了SpringBoot錯誤處理機(jī)制以及自定義異常處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下

上篇文章我們講解了使用Hibernate Validation來校驗數(shù)據(jù),當(dāng)校驗完數(shù)據(jù)后,如果發(fā)生錯誤我們需要給客戶返回一個錯誤信息,因此這節(jié)我們來講解一下SpringBoot默認(rèn)的錯誤處理機(jī)制以及如何自定義異常來處理請求錯誤。

一、SpringBoot默認(rèn)的錯誤處理機(jī)制

我們在發(fā)送一個請求的時候,如果發(fā)生404 SpringBoot會怎么處理呢?我們來發(fā)送一個不存在的請求來驗證一下看看頁面結(jié)果。如下所示:

當(dāng)服務(wù)器內(nèi)部發(fā)生錯誤的時候,頁面會返回什么呢?

 @GetMapping("/user/{id:\\d+}")
 public User get(@PathVariable String id) {
  throw new RuntimeException();
 }

我們會發(fā)現(xiàn)無論是發(fā)生什么錯誤,SpringBoot都會返回一個狀態(tài)碼以及一個錯誤頁面,這個錯誤頁面是怎么來的呢?
我們來看看SpringBoot錯誤處理模塊的源碼就會非常清楚,默認(rèn)的發(fā)生錯誤,它會將請求轉(zhuǎn)發(fā)到BasicErrorController控制器來處理請求,下面是該controller類的源碼:

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {

 private final ErrorProperties errorProperties;

 /**
  * Create a new {@link BasicErrorController} instance.
  * @param errorAttributes the error attributes
  * @param errorProperties configuration properties
  */
 public BasicErrorController(ErrorAttributes errorAttributes,
   ErrorProperties errorProperties) {
  this(errorAttributes, errorProperties,
    Collections.<ErrorViewResolver>emptyList());
 }

 /**
  * Create a new {@link BasicErrorController} instance.
  * @param errorAttributes the error attributes
  * @param errorProperties configuration properties
  * @param errorViewResolvers error view resolvers
  */
 public BasicErrorController(ErrorAttributes errorAttributes,
   ErrorProperties errorProperties, List<ErrorViewResolver> 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<String, Object> 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<Map<String, Object>> error(HttpServletRequest request) {
  Map<String, Object> body = getErrorAttributes(request,
    isIncludeStackTrace(request, MediaType.ALL));
  HttpStatus status = getStatus(request);
  return new ResponseEntity<Map<String, Object>>(body, status);
 }

從上面的源碼我們可以看到,它有兩個RequestMapping方法來映射錯誤請求,為什么會是兩個呢?其實(shí)errorHtml方法映射的是瀏覽器發(fā)送來的請求,而error方法映射的是不是瀏覽器而是其他軟件app客戶端發(fā)送的錯誤請求。

看了上面的源碼后,我們是否可以自己定義404或者500的錯誤頁面返回給客戶端呢?當(dāng)然可以,我們可以在src/main/resources路徑下新建文件夾reources/error文件夾,然后新建404.html和500.html然后編寫自己的錯誤內(nèi)容即可:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
 親,您所訪問的頁面不存在
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>500</title>
</head>
<body>
 服務(wù)器內(nèi)部錯誤
</body>
</html>

不過注意的是上面的這種自定義頁面的方式只在瀏覽器端有效,而不是瀏覽器發(fā)送的請求不會生效。因此下面我們就講一下如何自定義異常處理來解決這個問題。

二、自定義異常處理

怎么自定義異常處理客戶端發(fā)送的錯誤信息呢?如果我們查詢一個用戶,該用戶不存在,我們是否可以將不存在的用戶的id返回給客戶呢?這樣的效果不是給客戶更好地體驗嗎?下面我們來實(shí)現(xiàn)這個功能。
首先我們需要編寫一個exception類繼承RuntimeException類:

package cn.shinelon.exception;

/**
 * @author Shinelon
 *
 */
public class UserNotExistException extends RuntimeException{

 /**
  * 
  */
 private static final long serialVersionUID = 1L;
 private String id;
 public UserNotExistException(String id) {
  super("user not exist");
  this.id=id;
 }
public void setId(String id) {
 this.id = id;
}
public String getId() {
 return id;
}
}

接著我們需要編寫一個handler類處理controller層拋出的異常:

/**
 * 
 */
package cn.shinelon.exception;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
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;

/**
 * 控制器的異常處理類
 * @author Shinelon
 *
 */
//這個注解是指這個類是處理其他controller拋出的異常
@ControllerAdvice
public class ControllerExceptionHandler {

 //這個注解是指當(dāng)controller中拋出這個指定的異常類的時候,都會轉(zhuǎn)到這個方法中來處理異常
 @ExceptionHandler(UserNotExistException.class)
 //將返回的值轉(zhuǎn)成json格式的數(shù)據(jù)
 @ResponseBody
 //返回的狀態(tài)碼
 @ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)  //服務(wù)內(nèi)部錯誤
 public Map<String,Object> handlerUserNotExistException(UserNotExistException ex){
  Map<String,Object> result=new HashMap<String,Object>();
  result.put("id", ex.getId());
  result.put("message", ex.getMessage());
  return result;
 }
}

這個類加上@ControllerAdvice注解將會處理controller層拋出的對應(yīng)的異常,這里我們處理controller拋出的UserNotExistException自定義異常,并且將錯誤信息以及用戶id以json串的格式返回給客戶。

接著,我們在controller的請求方法中拋出這個異常,會看到在瀏覽器中的異常是我們自定義的異常返回的json數(shù)據(jù)。

Controller層代碼:

@GetMapping("/user/{id:\\d+}")
 //@RequestMapping(value="/user/{id:\\d+}",method=RequestMethod.GET)
 @JsonView(User.DetailJsonView.class)
 public User get(@PathVariable String id) {
  throw new UserNotExistException(id);
 }

到這里,我們就介紹了SpringBoot默認(rèn)的錯誤處理機(jī)制以及我們自定義異常來處理錯誤請求,這更有利于我們的開發(fā),帶給用戶更佳的使用效果。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • @CacheEvict + redis實(shí)現(xiàn)批量刪除緩存

    @CacheEvict + redis實(shí)現(xiàn)批量刪除緩存

    這篇文章主要介紹了@CacheEvict + redis實(shí)現(xiàn)批量刪除緩存方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 從Set里面取出有序的記錄詳解及實(shí)例

    Java 從Set里面取出有序的記錄詳解及實(shí)例

    這篇文章主要介紹了Java 從Set里面取出有序的記錄詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • SpringBoot枚舉類型參數(shù)認(rèn)證的實(shí)現(xiàn)代碼

    SpringBoot枚舉類型參數(shù)認(rèn)證的實(shí)現(xiàn)代碼

    項目當(dāng)中經(jīng)常需要接口參數(shù)是否在一個可選的范圍內(nèi),也就是驗證類枚舉參數(shù)的需求,所以本文我們將使用SpringBoot實(shí)現(xiàn)枚舉類型參數(shù)認(rèn)證,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-12-12
  • spring集成httpclient配置的詳細(xì)過程

    spring集成httpclient配置的詳細(xì)過程

    spring框架是一個非常強(qiáng)大的框架這里就不多說了,那么主要是介紹spring與httpclient的整合集成過程,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • IntelliJ?IDEA?2022.2最新版本激活教程(親測可用版)永久激活工具分享

    IntelliJ?IDEA?2022.2最新版本激活教程(親測可用版)永久激活工具分享

    Jetbrains官方發(fā)布了?IntelliJ?IDEA2022.2?正式版,每次大的版本更新,都會有較大的調(diào)整和優(yōu)化,除本次更新全面擁抱?Java?17?外,還有對IDE?UI界面,安全性,便捷性等都做了調(diào)整和優(yōu)化完善,用戶體驗提升不少,相信后面會有不少小伙伴跟著更新
    2022-08-08
  • Spring Boot使用Druid連接池的示例代碼

    Spring Boot使用Druid連接池的示例代碼

    Druid是Java語言中最好的數(shù)據(jù)庫連接池。這篇文章主要介紹了Spring Boot使用Druid連接池的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • java實(shí)現(xiàn)簡易連連看小游戲

    java實(shí)現(xiàn)簡易連連看小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡易連連看小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • java使用Feign實(shí)現(xiàn)聲明式Restful風(fēng)格調(diào)用

    java使用Feign實(shí)現(xiàn)聲明式Restful風(fēng)格調(diào)用

    這篇文章主要為大家詳細(xì)介紹了java使用Feign實(shí)現(xiàn)聲明式Restful風(fēng)格調(diào)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 詳解Java實(shí)踐之抽象工廠模式

    詳解Java實(shí)踐之抽象工廠模式

    抽象工廠模式用于產(chǎn)品族的構(gòu)建。抽象工廠是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠是指當(dāng)有多個抽象角色時使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產(chǎn)品的具體情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象
    2021-06-06
  • Java成員變量與局部變量(動力節(jié)點(diǎn)Java學(xué)院整理)

    Java成員變量與局部變量(動力節(jié)點(diǎn)Java學(xué)院整理)

    這篇文章主要介紹了Java成員變量與局部變量的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-04-04

最新評論

正镶白旗| 建阳市| 霍林郭勒市| 贵港市| 沐川县| 紫阳县| 南江县| 额济纳旗| 轮台县| 富民县| 南平市| 萨迦县| 长兴县| 马鞍山市| 芦溪县| 彭州市| 辽源市| 遵义市| 同仁县| 昭苏县| 清水县| 和平区| 且末县| 舟曲县| 简阳市| 永泰县| 育儿| 万全县| 保德县| 志丹县| 十堰市| 孝感市| 马边| 沐川县| 九江县| 洪泽县| 满城县| 连平县| 花莲市| 洛川县| 额敏县|