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

java如何動態(tài)的處理接口的返回?cái)?shù)據(jù)

 更新時(shí)間:2023年01月30日 09:06:19   作者:爛筆頭  
本文主要介紹了java如何動態(tài)的處理接口的返回?cái)?shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

0、需求說明

業(yè)務(wù)場景:服務(wù)A對接了服務(wù)B,服務(wù)C等服務(wù)的一些接口,然后由服務(wù)A統(tǒng)一暴露接口給到外部用戶使用。

需求是:

  • 服務(wù)A可以動態(tài)的接入服務(wù)B/C的接口,對外暴露并無需重啟(不在本文的討論)
  • 對接的服務(wù)B/C的接口部分字段需要過濾掉,不透出給外部用戶(如數(shù)據(jù)庫的自增ID等敏感信息)。

1、 思路方案

基本思路:在服務(wù)A里對各個(gè)服務(wù)接口返回的數(shù)據(jù)進(jìn)行攔截并二次加工后再返回給前端。

  • 攔截:比較簡單,可以在服務(wù)A對其他服務(wù)接口請求的返回之后進(jìn)行業(yè)務(wù)操作,也可以統(tǒng)一放到切面里用 @After 注解進(jìn)行操作。從 demo 的快速演示考慮,這里選擇直接在請求的返回體直接進(jìn)行業(yè)務(wù)操作。

  • 二次加工:服務(wù)A對返回body的部分字段過濾掉,不返回給前端。二次加工的方法有很多種,比如:

    a. 用一個(gè) map 去接收 body,然后對這個(gè) body map 進(jìn)行遍歷,和服務(wù)A里的 map 進(jìn)行比較, 將服務(wù)A map 里需要的 key-value,從 body map 里遍歷取出,put 到一個(gè)新的 map,最后返回這個(gè)新的 map 給前端。

    b. 用 string 去接收 body,接收到的body是一個(gè) json 字符串,然后將 json 字符串轉(zhuǎn)成特定的對象(這個(gè)對象是返回給前端的),這樣對象里沒有定義的字段在 json 字符串轉(zhuǎn)對象的過程中就會被舍棄。

方案a有幾個(gè)缺陷:

  • 首先,要求其他服務(wù)接口的返回必須是一個(gè) json 類型(可用 map 接收),如果是一個(gè) json數(shù)組([{},{}])的話, 就無法用map接收,這樣會導(dǎo)致對接入服務(wù)的接口數(shù)據(jù)結(jié)構(gòu)有限制,不ok;
  • 其次,map 數(shù)據(jù)類型可能會很復(fù)雜,由于不確定 map 里的 value的數(shù)據(jù)結(jié)構(gòu)是 string,list 還是 map 等,就需要用 instanceof 對所有的數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷判斷再比較賦值,很復(fù)雜,計(jì)算效率也不高。
  • 沒有可利用的輪子,類似將對象A賦值給對象B的屬性拷貝(BeanUtils.copyProperties()),可以將mapA的 key-value 賦值給mapB
# mapA
{
    "a": "a",
    "b": "b",
    "c": "c"
}
# mapB
{
    "a": null,
    "b": null,
}

相反,方案b有一個(gè)很大的優(yōu)勢:可以利用現(xiàn)成的序列化和反序列化工具(如Gson)來實(shí)現(xiàn)我們的需求。先放一個(gè)反序列化的工具,后面會用到:

/**
 * Json字符串轉(zhuǎn)為指定的對象
 * @param ret json字符串
 * @param clazz 指定對象的類
 * @return T 指定的對象
 */
public class JsonUtil {

    public static  <T> T jsonStr2Obj(String ret, Class<T> clazz) {
        Gson gson = new Gson();
        return gson.fromJson(ret, (Type) clazz);
    }    
}

但是說到這里,解決的只是對接口返回body的修改,沒有體現(xiàn)出標(biāo)題的“動態(tài)”二字。那么如何可以動態(tài)的對返回的body數(shù)據(jù)進(jìn)行過濾處理呢?用 groovy 動態(tài)加載類。

2 、 具體實(shí)施

  • 獲取接口的返回(以string類型):
ResponseEntity<String> exchange = restTemplate.getForEntity($url, String.class);
String body = exchange.getBody();
  • 通過groovy獲取動態(tài)編譯類
String clazzInString = getFromRedis($key) // 從redis獲取字符串類型的java class
Object obj = DynamicClassCompilerUtil.run(clazzInString)
public class DynamicClassCompilerUtil {
    public static Object run(String cls) {
        Class<?> clazz = new GroovyClassLoader().parseClass(cls);
        try {
            return clazz.newInstance();
        } catch (Exception e) {
            log.error("parse groovy class failed: {}", e);
            return null;
        }
    }
}
  • 將 body 反序列化
Object ret = JsonUtil.jsonStr2Obj(body, o.getClass()) 

該 ret 對象即為過濾后的對象,可以加工后返回給前端。

至此,“對接的服務(wù)B/C的接口部分字段需要過濾掉,不透出給外部用戶(如數(shù)據(jù)庫的自增ID等敏感信息)” 需求實(shí)現(xiàn)了。

至于 “服務(wù)A可以動態(tài)的接入服務(wù)B/C的接口,對外暴露并無需重啟” 需求,有時(shí)間的話,將會另起一篇來講。

到此這篇關(guān)于java如何動態(tài)的處理接口的返回?cái)?shù)據(jù)的文章就介紹到這了,更多相關(guān)java 動態(tài)處理接口的返回?cái)?shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Boolean引發(fā)缺陷的解決

    Java中Boolean引發(fā)缺陷的解決

    本文主要介紹了Java中Boolean引發(fā)缺陷的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • JavaWeb文件上傳流程

    JavaWeb文件上傳流程

    這篇文章主要介紹了JavaWeb文件上傳流程,JavaWeb中最重要的技術(shù)之一,下文關(guān)于其文件上傳的流程分享,需要的小伙伴可以參考一下
    2022-05-05
  • MAC下基于maven使用IDEA走讀TestNG源碼解析

    MAC下基于maven使用IDEA走讀TestNG源碼解析

    這篇文章主要介紹了MAC下基于maven使用IDEA走讀TestNG源碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-06-06
  • Java正則表達(dá)式基礎(chǔ)語法詳解

    Java正則表達(dá)式基礎(chǔ)語法詳解

    這篇文章主要介紹了Java正則表達(dá)式語法,包括常用正則表達(dá)式、匹配驗(yàn)證-驗(yàn)證Email是否正確以及字符串中查詢字符或者字符串,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 實(shí)例講解Java 自旋鎖

    實(shí)例講解Java 自旋鎖

    這篇文章主要介紹了Java 自旋鎖的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā),感興趣的朋友可以了解下
    2020-09-09
  • 生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解

    生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解

    這篇文章主要介紹了生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot項(xiàng)目設(shè)置斷點(diǎn)debug調(diào)試無效忽略web.xml問題的解決

    SpringBoot項(xiàng)目設(shè)置斷點(diǎn)debug調(diào)試無效忽略web.xml問題的解決

    這篇文章主要介紹了SpringBoot項(xiàng)目設(shè)置斷點(diǎn)debug調(diào)試無效忽略web.xml問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 分布式難題ElasticSearch解決大數(shù)據(jù)量檢索面試

    分布式難題ElasticSearch解決大數(shù)據(jù)量檢索面試

    這篇文章主要為大家介紹了分布式面試難題,ElasticSearch解決大數(shù)據(jù)量檢索的問題分析回答,讓面試官無話可說,幫助大家實(shí)現(xiàn)面試開薪自由
    2022-03-03
  • 詳解Spring Boot配置文件之多環(huán)境配置

    詳解Spring Boot配置文件之多環(huán)境配置

    本篇文章主要介紹了詳解Spring Boot配置文件之多環(huán)境配置 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • IDEA離線安裝maven helper插件的圖文教程

    IDEA離線安裝maven helper插件的圖文教程

    本文通過圖文并茂的形式給大家介紹IDEA離線安裝maven helper插件,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-08-08

最新評論

蓝田县| 丰原市| 铜川市| 新民市| 永吉县| 宜春市| 庆安县| 江北区| 阿勒泰市| 永和县| 江北区| 任丘市| 高唐县| 涞水县| 从江县| 房山区| 河南省| 错那县| 白银市| 怀集县| 蒙山县| 昭平县| 礼泉县| 富源县| 三穗县| 武功县| 理塘县| 文山县| 德庆县| 泰顺县| 仙游县| 三门县| 庄河市| 曲靖市| 台中县| 嘉祥县| 西青区| 兰考县| 阿坝| 扶沟县| 疏勒县|