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

Spring中的@ResponseStatus使用

 更新時間:2022年11月16日 10:00:37   作者:lvbinbin2yujie  
這篇文章主要介紹了Spring中的@ResponseStatus使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@ResponseStatus這個注解確實是個令我頭疼的注解.

先記錄下@ResponseStatus注解的定義. 記錄幾個得到的信息:@ResponseStatus聲明在方法、類上, Spring3.0開始才有的, 三個屬性其中 HttpStatus類型的 value 和 code是一個含義, 默認值就是 服務器 500錯誤的 HttpStatus.

1. 用法一:標注在@RequestMapping方法上

@Controller
@RequestMapping("/simple")
public class SimpleController {
 
    @RequestMapping("/demo2")
    @ResponseBody
    @ResponseStatus(code = HttpStatus.OK)
    public String demo2(){
        return "hello world";
    }
}

上面說了 code 和 value一個意思,這里我就用code了,相對而言比較喜歡code單詞. 這里作用就是改變服務器響應的狀態(tài)碼 ,比如一個本是200的請求可以通過@ResponseStatus 改成404/500等等.

常見的幾個狀態(tài)碼 HttpStatus.OK 就是 200 , HttpStatus.INTERNAL_SERVER_ERROR 就是 500 等等 ,具體的查看 HttpStatus枚舉 有詳細說明.

實現(xiàn)原理呢,注解底層還是通過設置 response.setStatus來實現(xiàn).

1.1 在@RequestMapping方法執(zhí)行完成

Spring解析返回值之前,進行了responseStatus設置

代碼片段位于:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#setResponseStatus

this對象指當前的ServletInvocableHandlerMethod,看到 @ResponseStatus的reason不為空,就調用response.sendError ; reason為空,就調用setStatus方法僅僅設置響應狀態(tài)碼.

1.2 記錄下在哪里調用了這個responseStatus方法 ?

代碼片段位于:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle

發(fā)現(xiàn)如果ServletInvocableHandlerMethod的responseReason有值,也就是@ResponseStatus有reason屬性,@RequestMapping方法返回值都不處理了,直接返回;

也就是說只要有@ResponseStatus的 reason屬性標注在 處理器Controller類或者方法上,比如響應狀態(tài)碼code設置為 404,reason設置為頁面沒找到 ,那 tomcat 展示界面是這樣大概,展示信息就是我們寫的reason屬性.

@ResponseStatus(code=A,reason=B)標注在 @RequestMapping方法上,作用效果與 response.sendError(A,B)是一樣的.

所以,@ResponseStatus我建議啊, 這種方式下使用千萬不要加 reason, 就把@ResponseStatus 當做一個用來改變響應狀態(tài)碼的方式!

2. 用法二:標注在@ControllerAdvice中

@ControllerAdvice
@ResponseStatus
public class MyControllerAdvice {
 
    @ExceptionHandler({ArithmeticException.class})
    public ModelAndView fix(Exception e){
        Map map=new HashMap();
        map.put("ex",e.getMessage());
        return new ModelAndView("error",map);
    }
 
}

@ControllerAdvice標注初衷我想就是程序運行過程中發(fā)生異常,對異常如何處理? 而@ResponseStatus標注在@ControllerAdvice類或者該類下的@ExceptionHandler上,區(qū)別大概就是,

原來比如請求程序拋出異常,異常被捕獲,走@ExceptionHandler,正常走完狀態(tài)碼是200.

@ControllerAdvice或者 @ExceptionHandler標注了@ReponseStatus,那走完狀態(tài)碼就是500.

如果你再給@ResponseStatus添加了reason屬性,不管捕獲異常方法咋返回,都是服務器的錯誤碼捕獲界面,比如上面我的例子,給@ResponseStatus添加reason=”your defined message”.

不管怎么說,下面界面比一大堆異常堆棧信息看起來更簡潔,但我還是不推薦使用誒,原因啊,界面不友好.

3. 用法三:自定義類型的異常添加注解@ResponseStatus

@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR,reason = "not  an error , just info")
public class MyException extends RuntimeException {
    public MyException() {
    }
 
    public MyException(String message) {
        super(message);
    }
}

這樣子,在SpringMvc中如果有某個 @RequestMapping方法拋出該異常, 只要開啟<mvc:annotation-driven/>,異常自動展示的界面都是如下的:

4. SpringMvc異常捕獲方法如下

代碼片段位于:org.springframework.web.servlet.DispatcherServlet#processHandlerException

<mvc:annotation-driven/>注冊了三個HandlerExceptionResolver:ExceptionHandlerExceptionResolver用來處理@ExceptionHandler,而ResponseStatusExceptionResolver是用來處理拋出的異常上標注了@ResponseStatus的解析器.

4.1 ResponseStatusExceptionResolver解析異常方式

代碼片段位于:org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#doResolveException

ex就是@RequestMapping方法拋出自定義的異常,使用工具類解析自定義異常上的@ResponseStatus注解,找到注解就調用resolveResponseStatus進行響應的處理。

protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response,
            Object handler, Exception ex) {
 
        ResponseStatus responseStatus = AnnotatedElementUtils.findMergedAnnotation(ex.getClass(), ResponseStatus.class);
        if (responseStatus != null) {
            try {
                return resolveResponseStatus(responseStatus, request, response, handler, ex);
            }
            catch (Exception resolveEx) {
                logger.warn("Handling of @ResponseStatus resulted in Exception", resolveEx);
            }
        }
        else if (ex.getCause() instanceof Exception) {
            ex = (Exception) ex.getCause();
            return doResolveException(request, response, handler, ex);
        }
        return null;
    }

4.2 ResponseStatusExceptionResolver如何根據(jù)異常上的@ResponseStatus處理響應?

代碼片段位于:org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#resolveResponseStatus

獲取了@ReponseStatus的 code reason屬性,reason不為空就 response.sendError(statusCode, reason) ,并且返回一個空的ModelAndView,這里的ModelAndView已經沒有意義了,SendError方法簡單來說就是會跳轉到web.xml中配置的 錯誤狀態(tài)碼 對應的頁面, 沒有配置就是默認的服務器的那種錯誤界面,且只展示 前面的reason信息,即響應類型為text/html .

5. 總結

不管哪種方式,@ReponseStatus最后都是通過response.setStatus或response.sendError來處理.

如果只是為了返回狀態(tài)碼,建議只使用 @ResponseStatus(code=xxxx)這樣來設置響應狀態(tài)碼;

如果拋出異常呢,不建議@ControllerAdvice里面的 @ResponseStatus和 自定義異常上的 @ResponseStatus一起使用, 按照我的閱讀理解,兩個一起使用肯定是一個生效,而且是 @ControllerAdvice中的@ResponseStatus生效.

場景分析:假設拋出異常不是我們自定義的異常,我們想改變響應的狀態(tài)碼,通過@ExceptionHandler來處理異常,并在@ExceptionHandler方法上也可以設置@ResponseStatus來達到效果;

假如拋出自定義的異常,自己沒有定義異常處理界面,那在異常上標注@ResponseStatus就可以走 服務器默認的界面展示,或者通過web.xml 配置error-code \ error-page來自定義界面處理異常;

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java I/O流實例之簡歷替換

    Java I/O流實例之簡歷替換

    流是一種抽象概念,它代表了數(shù)據(jù)的無結構化傳遞。。用來進行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進行輸入輸出
    2021-09-09
  • 解決java.lang.IllegalStateException:Duplicate key異常問題

    解決java.lang.IllegalStateException:Duplicate key異常問題

    java.lang.IllegalStateException:Duplicatekey異常在將List轉換為Map時出現(xiàn),解決方法是使用toMap()的重載方法,如果已經存在則不再修改,直接使用上一個數(shù)據(jù)
    2025-03-03
  • 通過RedisTemplate連接多個Redis過程解析

    通過RedisTemplate連接多個Redis過程解析

    這篇文章主要介紹了通過RedisTemplate連接多個Redis過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 通過實例了解Java Integer類和int的區(qū)別

    通過實例了解Java Integer類和int的區(qū)別

    這篇文章主要介紹了通過實例了解Java Integer類和int的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • java讀取XML文件的四種方法總結(必看篇)

    java讀取XML文件的四種方法總結(必看篇)

    下面小編就為大家?guī)硪黄猨ava讀取XML文件的四種方法總結(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 使用eclipse導入javaWeb項目的圖文教程

    使用eclipse導入javaWeb項目的圖文教程

    這篇文章主要介紹了如何使用eclipse導入別人的javaWeb項目,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot如何取消內置Tomcat啟動并改用外接Tomcat

    SpringBoot如何取消內置Tomcat啟動并改用外接Tomcat

    這篇文章主要介紹了SpringBoot如何取消內置Tomcat啟動并改用外接Tomcat,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SpringMVC實現(xiàn)controller中獲取session的實例代碼

    SpringMVC實現(xiàn)controller中獲取session的實例代碼

    本篇文章主要介紹了SpringMVC實現(xiàn)controller中獲取session的實例代碼,具有一定的參考價值,有興趣的可以了解一下。
    2017-02-02
  • java實現(xiàn)抖音代碼舞源碼

    java實現(xiàn)抖音代碼舞源碼

    這篇文章主要為大家詳細介紹了java實現(xiàn)抖音代碼舞的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • java高并發(fā)鎖的3種實現(xiàn)示例代碼

    java高并發(fā)鎖的3種實現(xiàn)示例代碼

    本篇文章主要介紹了java高并發(fā)鎖的3種實現(xiàn)示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

霍林郭勒市| 游戏| 吴堡县| 金溪县| 莱西市| 类乌齐县| 镇江市| 休宁县| 泰来县| 特克斯县| 望都县| 大洼县| 和田市| 桃江县| 怀集县| 余干县| 永济市| 伊宁市| 上林县| 临澧县| 新巴尔虎右旗| 墨竹工卡县| 元朗区| 甘泉县| 泰兴市| 牟定县| 双鸭山市| 长子县| 蒙山县| 香河县| 荣昌县| 策勒县| 灌南县| 新津县| 阿勒泰市| 修武县| 古浪县| 海盐县| 渑池县| 儋州市| 温泉县|