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

SpringBoot統(tǒng)一返回處理出現(xiàn)cannot?be?cast?to?java.lang.String異常解決

 更新時間:2023年09月01日 10:35:49   作者:伏加特遇上西柚  
這篇文章主要給大家介紹了關(guān)于SpringBoot統(tǒng)一返回處理出現(xiàn)cannot?be?cast?to?java.lang.String異常解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下

一 問題出現(xiàn)背景:

在使用 @RestControllerAdvice 和實現(xiàn) ResponseBodyAdvice controller 層統(tǒng)一返回封裝時。當(dāng)返回字符串時會報 “cannot be cast to java.lang.String” 異常,返回其他類型就無任何問題。

二 解決方案

如果返回的是字符串直接手動封裝返回對象轉(zhuǎn)成json字符串返回即可。

完整代碼

@RestControllerAdvice
public class ResponseResult implements ResponseBodyAdvice<Object> {
    /**
     * 支持注解@ResponseNotIntercept,使某些方法無需使用Result封裝
     *
     * @param returnType 返回類型
     * @param converterType  選擇的轉(zhuǎn)換器類型
     * @return true 時會執(zhí)行beforeBodyWrite方法,false時直接返回給前端
     */
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        if (returnType.getDeclaringClass().isAnnotationPresent(ResponseNotIntercept.class)) {
            //若在類中加了@ResponseNotIntercept 則該類中的方法不用做統(tǒng)一的攔截
            return false;
        }
        if (returnType.getMethod().isAnnotationPresent(ResponseNotIntercept.class)) {
            //若方法上加了@ResponseNotIntercept 則該方法不用做統(tǒng)一的攔截
            return false;
        }
        return true;
    }
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof Result) {
            // 提供一定的靈活度,如果body已經(jīng)被包裝了,就不進(jìn)行包裝
            return body;
        }
        if (body instanceof String) {
            //解決返回值為字符串時,不能正常包裝
            return JSON.toJSONString(Result.success(body));
        }
        return Result.success(body);
    }
}

三 異常原因分析

原因:

SpringMVC 默認(rèn)會注冊一些自帶的 HttpMessageConvertor (從先后順序排列分別為ByteArrayHttpMessageConverter、StringHttpMessageConverter、ResourceHttpMessageConverter,SourceHttpMessageConverter、AllEncompassingFormHttpMessageConverter) ,后端服務(wù)使用Restful API的形式,前后端得規(guī)范一般是json格式, SpringMVC 自帶 MappingJackson2HttpMessageConverter ,在依賴中引入 jackson 包后,容器會把 MappingJackson2HttpMessageConverter 自動注冊到 messageConverters 鏈的末尾

當(dāng)返回的數(shù)據(jù)是非字符串時使用的 MappingJackson2HttpMessageConverter 寫入返回對象。當(dāng)返回的數(shù)據(jù)是字符串時,此處得方法是要去循環(huán)遍歷 HttpMessageConverter 集,因為 StringHttpMessageConverter 會先被遍歷到,這時會認(rèn)為 StringHttpMessageConverter 可以使用,在返回 Result 是使用 ((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage) ;此方法是父類方法 body 參數(shù)類型為 Object ,實際調(diào)用的為 StringHttpMessageConverter 中的 addDefaultHeaders(HttpHeaders headers, String s, @Nullable MediaType type) 方法,使用 String 類型的 s 來接收 Result 類型的 body ,類型不匹配則出現(xiàn) Result cannot be cast to java.lang.String 異常。

源碼詳細(xì)分析:

正常返回:

步驟一:遍歷 messageConverters 去判斷到 MappingJackson2HttpMessageConverter GenericHttpMessageConverter 類型的 converter ;

步驟二:進(jìn)一步判斷到 MappingJackson2HttpMessageConverter 可以寫入對象類型的數(shù)據(jù)。

步驟三:調(diào)用 beforeBodyWriter 方法將原有的 TestVO 對象數(shù)據(jù)封裝到 Result 對象中。

步驟四:調(diào)用 MappingJackson2HttpMessageConverter 中的 wirte 方法(代碼中用接口類型接收的)

步驟五:通過 MappingJackson2HttpMessageConverter 繼承關(guān)系發(fā)現(xiàn)其write方法在父類 AbstractHttpMessageConverter 中,在 write 方法中調(diào)用本類中addDefaultHeaders 方法向輸出消息添加默認(rèn)報頭。(此處應(yīng)注意)

步驟六:將封裝好的Result對象返回給前端

返回為字符串異常

步驟一:遍歷 messageConverters 去判斷到 StringHttpMessageConverter 是null;

步驟二:進(jìn)一步判斷到 StringHttpMessageConverter 可以寫入String類型的數(shù)據(jù)。

步驟三:調(diào)用 beforeBodyWriter 方法將原有的 String 類型數(shù)據(jù)封裝到 Result 對象中。

步驟四:調(diào)用 StringHttpMessageConverter 中的 wirte 方法(代碼中用接口類型接收的)

步驟五

調(diào)用父類 AbstractHttpMessageConverter 中的 write 方法,由于 StringHttpMessageConverter 重寫了 addDefaultHeaders 方法,故 write 中調(diào)用子類中的 addDefaultHeaders 。由于父類中參數(shù)t為對象類型,對應(yīng)子類中接收的s為String類型故會出現(xiàn)類型轉(zhuǎn)換異常 Result cannot be cast to java.lang.String (此處應(yīng)注意)

總結(jié) 

到此這篇關(guān)于SpringBoot統(tǒng)一返回處理出現(xiàn)cannot be cast to java.lang.String異常解決的文章就介紹到這了,更多相關(guān)cannot be cast to java.lang.String異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • kafka springBoot配置的實現(xiàn)

    kafka springBoot配置的實現(xiàn)

    本文主要介紹了kafka springBoot配置的實現(xiàn),通過詳細(xì)解析Spring Boot for Apache Kafka的配置選項,以及如何優(yōu)化Kafka生產(chǎn)者和消費(fèi)者的屬性設(shè)置,感興趣的可以了解一下
    2023-11-11
  • Java實現(xiàn)TFIDF算法代碼分享

    Java實現(xiàn)TFIDF算法代碼分享

    這篇文章主要介紹了Java實現(xiàn)TFIDF算法代碼分享,對算法進(jìn)行了簡單介紹,概念,原理,以及實現(xiàn)代碼的分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java數(shù)組與字符串深入探索使用方法

    Java數(shù)組與字符串深入探索使用方法

    在今天的文章中,我將為你詳細(xì)講述Java學(xué)習(xí)中重要的一節(jié) [ 數(shù)組與字符串 ] ,帶你深入了解Java語言中數(shù)組的聲明、創(chuàng)建和初始化方法,字符串的定義以及常用到的操作方法
    2022-07-07
  • 利用Java實現(xiàn)網(wǎng)站聚合工具

    利用Java實現(xiàn)網(wǎng)站聚合工具

    互聯(lián)網(wǎng)上有數(shù)以萬億計的網(wǎng)站,每個網(wǎng)站大都具有一定的功能。搜索引擎雖然對互聯(lián)網(wǎng)上的部分網(wǎng)站建立了索引,但是其作為一個大而全的搜索系統(tǒng),無法很好的定位到一些特殊的需求。因此本文將介紹一個用java實現(xiàn)的網(wǎng)站數(shù)據(jù)聚合工具,需要的可以參考一下
    2022-01-01
  • Java中@Accessors使用的實現(xiàn)示例

    Java中@Accessors使用的實現(xiàn)示例

    本文主要介紹了Java中@Accessors使用的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • SpringMVC?處理后端日期格式的示例詳解

    SpringMVC?處理后端日期格式的示例詳解

    在WebMvcConfiguration中擴(kuò)展SpringMVC的消息轉(zhuǎn)換器,統(tǒng)一對日期類型進(jìn)行格式處理,本文給大家介紹SpringMVC處理后端日期格式,感興趣的朋友一起看看吧
    2023-11-11
  • Maven引用自定義jar包方式

    Maven引用自定義jar包方式

    這篇文章主要介紹了Maven引用自定義jar包方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 原來Java接口多實現(xiàn)還可以這樣玩

    原來Java接口多實現(xiàn)還可以這樣玩

    JAVA中類不直接支持多繼承,因為會出現(xiàn)調(diào)用的不確定性,所以JAVA將多繼承機(jī)制進(jìn)行改良,在JAVA中變成了多實現(xiàn),這篇文章主要給大家介紹了關(guān)于Java接口多實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Java基礎(chǔ)之構(gòu)造器、代碼塊、類加載時機(jī)的用法詳解

    Java基礎(chǔ)之構(gòu)造器、代碼塊、類加載時機(jī)的用法詳解

    這篇文章主要介紹了Java基礎(chǔ)之構(gòu)造器、代碼塊、類加載時機(jī)的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Mybatis中#{}與${}的區(qū)別詳解

    Mybatis中#{}與${}的區(qū)別詳解

    這篇文章主要介紹了Mybatis中#{}與${}的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

庆安县| 临湘市| 嘉祥县| 肃宁县| 玉门市| 文化| 贵溪市| 广东省| 新郑市| 宁都县| 武义县| 宁波市| 秭归县| 卢氏县| 宜都市| 黎城县| 乌什县| 东兴市| 贡山| 长顺县| 开化县| 广南县| 东安县| 涿州市| 普兰县| 黄浦区| 江油市| 麻城市| 富蕴县| 洛隆县| 喀什市| 德安县| 武清区| 云和县| 鄯善县| 长沙市| 四子王旗| 连城县| 德阳市| 乌恰县| 盐山县|