日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

一招教你解決頁(yè)面中關(guān)聯(lián)id的轉(zhuǎn)換

來(lái)源: 責(zé)編: 時(shí)間:2024-05-17 09:02:59 172觀看
導(dǎo)讀在工作中,我們經(jīng)常有這樣的業(yè)務(wù)情況,實(shí)體間通過(guò)id實(shí)現(xiàn)數(shù)據(jù)業(yè)務(wù)上的關(guān)聯(lián),比如訂單和用戶,訂單的創(chuàng)建人id、商品id等,在頁(yè)面查詢時(shí)我們需要將對(duì)應(yīng)的id信息轉(zhuǎn)換成對(duì)應(yīng)的中文描述,比如用戶中文名稱,商品中文名稱等。如果是單條數(shù)

在工作中,我們經(jīng)常有這樣的業(yè)務(wù)情況,實(shí)體間通過(guò)id實(shí)現(xiàn)數(shù)據(jù)業(yè)務(wù)上的關(guān)聯(lián),比如訂單和用戶,訂單的創(chuàng)建人id、商品id等,在頁(yè)面查詢時(shí)我們需要將對(duì)應(yīng)的id信息轉(zhuǎn)換成對(duì)應(yīng)的中文描述,比如用戶中文名稱,商品中文名稱等。如果是單條數(shù)據(jù)的展示還好,但是設(shè)計(jì)到列表查詢,如何高效、優(yōu)雅地實(shí)現(xiàn)這個(gè)效果呢?HuF28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在接口返回的數(shù)據(jù)基本都是JSON格式,比如spring中使用了jackson,在controller層對(duì)結(jié)果進(jìn)行json序列化,而我們要做的就是在序列化的過(guò)程中,實(shí)現(xiàn)id的轉(zhuǎn)換HuF28資訊網(wǎng)——每日最新資訊28at.com

使用方式

定義實(shí)體轉(zhuǎn)換接口

由于需要對(duì)訂單實(shí)體中的創(chuàng)建人id進(jìn)行轉(zhuǎn)換HuF28資訊網(wǎng)——每日最新資訊28at.com

public interface UserConvert {    String USER_CACHE = "USER_CACHE";    String userId();    default ConvertItem getUserConvert(){        if( userId() == null ){            return null;        }        return new ConvertItem(userId(), USER_CACHE);    }}

定義接口轉(zhuǎn)換適配器

基于上面UserConvert的處理,基于緩存實(shí)現(xiàn),同時(shí)支持一個(gè)實(shí)體中多個(gè),比如商品名稱、商品分類等HuF28資訊網(wǎng)——每日最新資訊28at.com

public class UserConvertProvider extends CacheItemConvertAdapter {    private static String name = UserConvert.USER_CACHE;    public UserConvertProvider() {        super(name, User.class);    }    @Override    public boolean support(ConvertItem convertItem) {        return convertItem != null && convertItem.getName().equals(name);    }    @Override    public String convert(ConvertItem convertItem) {        if( convertItem == null ){            return null;        }        User user = (User) fromCache(convertItem.getId());        return user != null ? user.getCaption() : null;    }}

需要轉(zhuǎn)換的數(shù)據(jù)緩存

該實(shí)現(xiàn)依賴緩存,需要優(yōu)先對(duì)需要轉(zhuǎn)換的數(shù)據(jù)進(jìn)行緩存,因此示例中添加了緩存示例HuF28資訊網(wǎng)——每日最新資訊28at.com

public void init(){    Cache cache = cacheManager.getCache(UserConvert.USER_CACHE);    if( cache != null ){        cache.put("u1", new User("u1","Tom"));    }}

實(shí)體定義

實(shí)體中需要通過(guò)實(shí)現(xiàn)接口UserConvert,這樣對(duì)多個(gè)數(shù)據(jù)項(xiàng)轉(zhuǎn)換時(shí)可以繼續(xù)擴(kuò)展HuF28資訊網(wǎng)——每日最新資訊28at.com

public class Order implements UserConvert {    private String id;    private String name;    private LocalDateTime createTime = LocalDateTime.now();    /**     * 創(chuàng)建用戶     */    private String creator;    @Override    public String userId() {        return creator;    }}

實(shí)現(xiàn)效果

可以看到,在輸出json中,多了一列userConvert,也就是接口中定義的get*方法HuF28資訊網(wǎng)——每日最新資訊28at.com

{    "id": "1",    "name": "測(cè)試訂單",    "createTime": "2024-05-08T21:55:51.5747507",    "creator": "u1",    "userConvert": "Tom"}

實(shí)現(xiàn)原理

上面說(shuō)的,主要實(shí)現(xiàn)基于緩存,在web查詢結(jié)果進(jìn)行json序列化時(shí),依賴于jackson的擴(kuò)展,對(duì)輸出結(jié)果匹配的類型進(jìn)行轉(zhuǎn)換。HuF28資訊網(wǎng)——每日最新資訊28at.com

@EnableCaching@Configurationpublic class JacksonCustomConfiguration{    @Bean    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){        return jacksonObjectMapperBuilder -> configureMapperBuilder(jacksonObjectMapperBuilder);    }    private void configureMapperBuilder(Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder) {        jackson2ObjectMapperBuilder.serializers(convertSerializer());    }    @Bean    public ItemConvertSerializer convertSerializer(){        return new ItemConvertSerializer(ConvertItem.class);    }}
  1. 在配置文件中基于Jackson2ObjectMapperBuilderCustomizer對(duì)jackson進(jìn)行擴(kuò)展
  2. 定義ItemConvertSerializer對(duì)ConvertItem類型的屬性進(jìn)行處理,該類主要繼承于StdSerializer
  3. 在ItemConvertSerializer中基于ConvertItem的name屬性來(lái)匹配對(duì)應(yīng)的緩存并進(jìn)行轉(zhuǎn)換
  4. 注意開(kāi)啟spring緩存*@EnableCaching*
  5. 最后基于spring特性,定義*/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports*來(lái)實(shí)現(xiàn)自動(dòng)注入配置
  • ConvertItem示例
@Getter@Setterpublic class ConvertItem {    private String id;    private String text;    private String name;    public ConvertItem() {    }    public ConvertItem(String id, String name) {        this.id = id;        this.name = name;    }}
  • ItemConvertAdapter擴(kuò)展適配器,主要于ConvertItem搭配擴(kuò)展
public interface ItemConvertAdapter {    /**     * @param convertItem     * @return     */    boolean support(ConvertItem convertItem);    /**     *     * @param convertItem     * @return     */    String convert(ConvertItem convertItem);}
  • ItemConvertSerializer示例
public class ItemConvertSerializer extends StdSerializer<ConvertItem> implements ApplicationContextAware {    private List<ItemConvertAdapter> itemConvertAdapters;    public ItemConvertSerializer(Class<ConvertItem> t) {        super(t);    }    @Override    public void serialize(ConvertItem value, JsonGenerator gen, SerializerProvider provider) throws IOException {        String text = "";        if(!CollectionUtils.isEmpty(itemConvertAdapters)){            for (ItemConvertAdapter itemConvertAdapter : itemConvertAdapters) {                if( itemConvertAdapter.support(value) ){                    text = itemConvertAdapter.convert(value);                    break;                }            }        }        gen.writeString(text);    }    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        Map<String, ItemConvertAdapter> itemConvertAdapterMap                = BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ItemConvertAdapter.class, true, false);        if( !itemConvertAdapterMap.isEmpty() ){            itemConvertAdapters = new ArrayList<>(itemConvertAdapterMap.values());            itemConvertAdapters.sort(OrderComparator.INSTANCE);        }    }}

優(yōu)缺點(diǎn)

  • 使用了jackson序列化的擴(kuò)展,如果使用其他序列化工具,需要單獨(dú)支持。
  • 依賴于數(shù)據(jù)緩存,一般針對(duì)通用數(shù)據(jù)才有數(shù)據(jù)轉(zhuǎn)換的需要,比如用戶、部門數(shù)據(jù)等,一般這些數(shù)據(jù)更適合緩存。

本文鏈接:http://www.www897cc.com/showinfo-26-88739-0.html一招教你解決頁(yè)面中關(guān)聯(lián)id的轉(zhuǎn)換

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: React 中的國(guó)際化優(yōu)秀實(shí)踐

下一篇: 怪不得這么多人學(xué) React!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 中興AX5400Pro+上手體驗(yàn):再升級(jí) 雙2.5G網(wǎng)口+USB 3.0這次全都有

    2021年11月的時(shí)候,中興先后發(fā)布了兩款路由器產(chǎn)品,中興AX5400和中興AX5400 Pro,從產(chǎn)品命名上就不難看出這是隸屬于同一系列的,但在外觀設(shè)計(jì)上這兩款產(chǎn)品可以說(shuō)是完全沒(méi)一點(diǎn)關(guān)系
  • Redmi Buds 4開(kāi)箱簡(jiǎn)評(píng):才199還有降噪 可以無(wú)腦入

    在上個(gè)月舉辦的Redmi Note11T Pro系列新機(jī)發(fā)布會(huì)上,除了兩款手機(jī)新品之外,Redmi還帶來(lái)了兩款TWS真無(wú)線藍(lán)牙耳機(jī)產(chǎn)品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們?cè)赗edmi Note11T
  • 6月iOS設(shè)備性能榜:M2穩(wěn)居榜首 A系列只能等一手3nm來(lái)救

    沒(méi)有新品發(fā)布,自然iOS設(shè)備性能榜的上榜設(shè)備就沒(méi)有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動(dòng),畢竟蘋果新品的發(fā)布節(jié)奏就是這樣的,一年下來(lái)也就幾個(gè)移動(dòng)端新品,不會(huì)像安卓廠商,一
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個(gè)線程之間通過(guò)某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:Object 類下
  • CSS單標(biāo)簽實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)logo

    轉(zhuǎn)轉(zhuǎn)品牌升級(jí)后更新了全新的Logo,今天我們用純CSS來(lái)實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)的新Logo,為了有一定的挑戰(zhàn)性,這里我們只使用一個(gè)標(biāo)簽實(shí)現(xiàn),將最大化的使用CSS能力完成Logo的繪制與動(dòng)畫效果。新logo
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們?cè)谌粘9ぷ骱蜆I(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會(huì)面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會(huì)導(dǎo)致開(kāi)發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 為什么你不應(yīng)該使用Div作為可點(diǎn)擊元素

    按鈕是為任何網(wǎng)絡(luò)應(yīng)用程序提供交互性的最常見(jiàn)方式。但我們經(jīng)常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過(guò)這樣做,我們錯(cuò)過(guò)了許多內(nèi)置瀏覽器的功能。
  • 微博大門常打開(kāi),迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語(yǔ)了&rdquo;。&ldquo;為什么日本人說(shuō)話我能聽(tīng)懂?&rdquo;&ldquo;中文不像中文,日語(yǔ)不像日語(yǔ),但是我竟然看懂了&rdquo;&hellip;&hell
  • 英特爾Xe-HP項(xiàng)目終止,將專注Xe-HPC/HPG系列顯卡

    據(jù)10 月 31 日消息報(bào)道,英特爾高級(jí)副總裁兼加速計(jì)算系統(tǒng)和圖形事業(yè)部總經(jīng)理 表示,Xe-HP“ Arctic Sound” 系列服務(wù)器 GPU 已經(jīng)應(yīng)用于 oneAPI devcloud 云服
Top 主站蜘蛛池模板: 汉阴县| 宝兴县| 盐城市| 吴忠市| 曲沃县| 丰城市| 枞阳县| 徐水县| 高雄县| 天峻县| 张家界市| 饶阳县| 洛川县| 江门市| 涞水县| 福安市| 杭锦后旗| 宜章县| 香港 | 保康县| 云南省| 鄂伦春自治旗| 米泉市| 舟山市| 资溪县| 冕宁县| 永德县| 镇平县| 北海市| 油尖旺区| 余干县| 凤台县| 涞源县| 龙门县| 旬阳县| 江油市| 高邮市| 安宁市| 呼和浩特市| 西宁市| 揭阳市|