成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
依賴于數據緩存,一般針對通用數據才有數據轉換的需要,比如用戶、部門數據等,一般這些數據更適合緩存。

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

現在接口返回的數據基本都是JSON格式,比如spring中使用了jackson,在controller層對結果進行json序列化,而我們要做的就是在序列化的過程中,實現id的轉換。

使用方式

定義實體轉換接口

由于需要對訂單實體中的創建人id進行轉換:

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的處理,基于緩存實現,同時支持一個實體中多個,比如商品名稱、商品分類等!

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;
    }
}

需要轉換的數據緩存

該實現依賴緩存,需要優先對需要轉換的數據進行緩存,因此示例中添加了緩存示例:

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

實體定義

實體中需要通過實現接口UserConvert,這樣對多個數據項轉換時可以繼續擴展。

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*方法:

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

實現原理

上面說的,主要實現基于緩存,在web查詢結果進行json序列化時,依賴于jackson的擴展,對輸出結果匹配的類型進行轉換。

@EnableCaching
@Configuration
public 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
@Setter
public 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序列化的擴展,如果使用其他序列化工具,需要單獨支持。
  • 依賴于數據緩存,一般針對通用數據才有數據轉換的需要,比如用戶、部門數據等,一般這些數據更適合緩存。
責任編輯:武曉燕 來源: Java技術指北
相關推薦

2018-06-27 10:10:34

APP評分彈窗蘋果

2022-09-06 11:53:00

開發計算

2021-06-28 20:01:07

電腦性能Windows 7

2012-02-01 15:41:42

2020-09-16 06:08:10

Linux文本比對代碼

2011-05-03 11:13:51

黑盒

2020-06-22 14:18:02

運維架構技術

2021-07-06 07:21:17

橋接模式組合

2010-01-06 09:54:59

2020-11-03 16:36:36

Windows微軟彈窗

2018-08-26 15:11:44

神經網絡機器學習對抗網絡

2022-02-06 00:02:43

Windows 11虛擬機微軟

2020-10-20 08:01:30

MySQL密碼Windows

2023-12-18 08:24:09

LinuxPythonWord

2022-06-21 09:27:01

PythonFlaskREST API

2019-01-23 10:11:43

Python爬蟲IP

2018-10-10 14:34:27

ARM嵌入式系統硬件

2022-02-17 17:19:31

鴻蒙語音識別語音播報

2020-11-17 06:43:16

安卓智能手機移動應用

2013-07-30 11:24:33

SAP“簡化IT 一招
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩一 | 欧美日韩在线一区二区三区 | 精品美女久久久久久免费 | 亚洲精品一区二区三区蜜桃久 | 99精品欧美一区二区蜜桃免费 | 国产婷婷 | 欧美亚洲网站 | 日韩视频在线观看中文字幕 | 亚洲乱码一区二区三区在线观看 | 91精品国产高清一区二区三区 | 九色av| 成人免费网站在线 | 免费观看日韩精品 | 国产精品成人久久久久 | 国产免费色 | 成人性生交大免费 | 欧美一区二区三区四区五区无卡码 | 成人美女免费网站视频 | 天天曰天天干 | 国产美女精品视频免费观看 | 日韩不卡在线 | 国产一区在线视频 | 国产精品入口久久 | 精品视频免费 | 免费国产一区二区 | 国产高清精品在线 | 中文字幕av在线 | 欧美1区 | 国内av在线| 精品国产高清一区二区三区 | 超碰天天| 欧美日韩在线一区二区 | 午夜网站视频 | 91精品国产一区二区在线观看 | 欧美九九 | 日韩在线观看视频一区 | 日韩成人 | 国产精品18毛片一区二区 | 久久逼逼 | 中文字幕成人av | 欧美成人精品二区三区99精品 |