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

當前位置:首頁 > 科技  > 軟件

一招教你解決頁面中關聯id的轉換

來源: 責編: 時間:2024-05-17 09:02:59 218觀看
導讀在工作中,我們經常有這樣的業務情況,實體間通過id實現數據業務上的關聯,比如訂單和用戶,訂單的創建人id、商品id等,在頁面查詢時我們需要將對應的id信息轉換成對應的中文描述,比如用戶中文名稱,商品中文名稱等。如果是單條數

在工作中,我們經常有這樣的業務情況,實體間通過id實現數據業務上的關聯,比如訂單和用戶,訂單的創建人id、商品id等,在頁面查詢時我們需要將對應的id信息轉換成對應的中文描述,比如用戶中文名稱,商品中文名稱等。如果是單條數據的展示還好,但是設計到列表查詢,如何高效、優雅地實現這個效果呢?BHp28資訊網——每日最新資訊28at.com

現在接口返回的數據基本都是JSON格式,比如spring中使用了jackson,在controller層對結果進行json序列化,而我們要做的就是在序列化的過程中,實現id的轉換BHp28資訊網——每日最新資訊28at.com

使用方式

定義實體轉換接口

由于需要對訂單實體中的創建人id進行轉換BHp28資訊網——每日最新資訊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);    }}

定義接口轉換適配器

基于上面UserConvert的處理,基于緩存實現,同時支持一個實體中多個,比如商品名稱、商品分類等BHp28資訊網——每日最新資訊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;    }}

需要轉換的數據緩存

該實現依賴緩存,需要優先對需要轉換的數據進行緩存,因此示例中添加了緩存示例BHp28資訊網——每日最新資訊28at.com

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

實體定義

實體中需要通過實現接口UserConvert,這樣對多個數據項轉換時可以繼續擴展BHp28資訊網——每日最新資訊28at.com

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

實現效果

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

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

實現原理

上面說的,主要實現基于緩存,在web查詢結果進行json序列化時,依賴于jackson的擴展,對輸出結果匹配的類型進行轉換。BHp28資訊網——每日最新資訊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對jackson進行擴展
  2. 定義ItemConvertSerializer對ConvertItem類型的屬性進行處理,該類主要繼承于StdSerializer
  3. 在ItemConvertSerializer中基于ConvertItem的name屬性來匹配對應的緩存并進行轉換
  4. 注意開啟spring緩存*@EnableCaching*
  5. 最后基于spring特性,定義*/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports*來實現自動注入配置
  • 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擴展適配器,主要于ConvertItem搭配擴展
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);        }    }}

優缺點

  • 使用了jackson序列化的擴展,如果使用其他序列化工具,需要單獨支持。
  • 依賴于數據緩存,一般針對通用數據才有數據轉換的需要,比如用戶、部門數據等,一般這些數據更適合緩存。

本文鏈接:http://m.www897cc.com/showinfo-26-88739-0.html一招教你解決頁面中關聯id的轉換

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: React 中的國際化優秀實踐

下一篇: 怪不得這么多人學 React!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品久久久久久影视| 亚洲淫性视频| 亚洲国产精品成人一区二区| 亚洲欧洲精品一区二区| 在线综合亚洲欧美在线视频| 亚洲性线免费观看视频成熟| 久久精品国产视频| 欧美女激情福利| 国产欧美69| 亚洲人成网站在线播| 亚洲在线一区二区| 久久网站免费| 欧美日韩在线不卡一区| 国产区在线观看成人精品| 亚洲黄色在线视频| 亚洲欧美国产高清va在线播| 美女主播精品视频一二三四| 国产精品magnet| 亚洲福利国产精品| 亚洲欧美日韩精品久久奇米色影视| 久久久久亚洲综合| 国产精品成人v| 欧美激情欧美激情在线五月| 欧美国产精品专区| 国产精品成人免费| 国产午夜精品久久久久久免费视| 亚洲二区在线视频| 99re6这里只有精品视频在线观看| 亚洲一区在线看| 久久精品91久久香蕉加勒比| 欧美精品一区在线| 麻豆成人综合网| 欧美激情中文字幕一区二区| 国产欧美日韩免费| 亚洲老司机av| 久久久久久综合| 国产精品国产三级国产| 亚洲精品日韩在线| 久久精品国产91精品亚洲| 欧美日韩三级| 亚洲国产精品成人综合| 欧美亚洲在线| 欧美日韩中国免费专区在线看| 在线观看日韩专区| 久久超碰97中文字幕| 欧美性生交xxxxx久久久| 亚洲国产精品t66y| 久久精品九九| 国产精品一区二区在线观看网站| 亚洲美女黄色片| 久久夜色精品一区| 国产欧美在线| 亚洲综合日韩中文字幕v在线| 欧美激情国产日韩| 亚洲第一网站免费视频| 久久露脸国产精品| 国产一区二区视频在线观看 | 在线观看欧美日韩| 欧美伊人久久久久久久久影院 | 国产日韩欧美精品在线| 亚洲天堂av综合网| 欧美韩日高清| 亚洲国产老妈| 麻豆乱码国产一区二区三区| 韩国av一区二区三区| 欧美制服丝袜| 国产欧美日本在线| 先锋影音国产精品| 国产精品一级| 欧美亚洲一区三区| 国产欧美在线观看| 欧美一级大片在线免费观看| 国产精品一级二级三级| 午夜精品99久久免费| 国产精品视区| 欧美有码在线观看视频| 国产亚洲福利| 久久精品国产一区二区三区| 国产自产精品| 久久久久女教师免费一区| 国内精品美女av在线播放| 久久成人免费| 黄色在线成人| 裸体素人女欧美日韩| 亚洲第一在线综合网站| 欧美福利电影网| 一区二区高清在线观看| 欧美日韩美女在线| 亚洲香蕉在线观看| 国产精品日韩欧美综合| 欧美亚洲在线播放| 黑人一区二区| 欧美国产免费| 中文精品视频| 国产欧美婷婷中文| 久久午夜视频| 亚洲国产视频一区| 欧美日韩亚洲一区二区三区在线观看 | 欧美大片免费观看| 亚洲精品综合精品自拍| 欧美少妇一区二区| 亚洲欧美色婷婷| 国产日产亚洲精品| 久久夜色精品| 亚洲精品在线观看免费| 欧美性大战久久久久久久| 香蕉久久夜色精品| 依依成人综合视频| 欧美另类99xxxxx| 亚洲自拍另类| 黄色国产精品| 欧美日本在线| 性欧美超级视频| 在线观看中文字幕不卡| 欧美日韩大陆在线| 午夜精品www| 激情小说另类小说亚洲欧美| 欧美久久久久久蜜桃| 午夜精品久久久久久| 在线播放一区| 国产精品福利在线观看| 久久精品久久99精品久久| 亚洲激情成人网| 国产精品嫩草99av在线| 免播放器亚洲一区| 亚洲一区二区在线看| 精品99一区二区| 欧美三级视频在线| 久久久精品国产一区二区三区| 亚洲欧洲日产国产网站| 国产精品婷婷| 欧美www视频| 欧美一区1区三区3区公司| 亚洲国产精品美女| 国产欧美日韩视频| 欧美福利视频一区| 香蕉免费一区二区三区在线观看| 亚洲电影自拍| 国产精品亚洲综合天堂夜夜| 欧美激情视频在线免费观看 欧美视频免费一 | 一区在线观看| 国产精品v亚洲精品v日韩精品| 久久久亚洲欧洲日产国码αv | 亚洲欧美日韩另类| 欧美在线二区| 亚洲精品国偷自产在线99热| 国产欧亚日韩视频| 欧美日韩精品三区| 久久综合网络一区二区| 亚洲欧美精品在线观看| 亚洲人成啪啪网站| 国产在线一区二区三区四区| 欧美日韩中文在线| 噜噜噜91成人网| 午夜精品在线看| 99视频有精品| 亚洲国产精品精华液2区45| 国产欧美一区二区三区在线老狼| 欧美理论电影网| 久久中文精品| 久久爱www| 午夜国产欧美理论在线播放| 日韩亚洲欧美高清| 亚洲福利在线看| 国产欧美综合在线| 国产精品美女久久| 欧美日韩一区二区精品| 欧美成人综合网站| 久久嫩草精品久久久久| 欧美一级成年大片在线观看| 亚洲一区二区三区精品在线观看| 亚洲精品影视在线观看| 在线日韩av| 激情久久五月天| 国产一二精品视频| 国产乱子伦一区二区三区国色天香| 欧美三级乱码| 欧美日韩在线直播| 欧美日韩国产色视频| 欧美成人高清| 美国十次了思思久久精品导航| 久久国产精品久久国产精品 | 欧美性猛交xxxx乱大交退制版| 欧美激情一区二区三区在线| 免费欧美日韩| 免费视频一区二区三区在线观看| 久久久91精品国产| 久久都是精品| 久久成人羞羞网站| 欧美一站二站| 久久国产精品网站| 久久国产99| 久久精品国产久精国产爱| 欧美在线free| 久久成人羞羞网站| 久久久久高清| 久久婷婷久久一区二区三区| 欧美中文字幕在线播放| 欧美在线播放一区| 久久国产黑丝| 久久综合久久综合这里只有精品| 乱码第一页成人| 男人天堂欧美日韩| 欧美精品亚洲二区|