当前位置:首页 > 科技  > 软件

一招教你解决页面中关联id的转换

来源: 责编: 时间:2024-05-17 09:02:59 217观看
导读在工作中,我们经常有这样的业务情况,实体间通过id实现数据业务上的关联,比如订单和用户,订单的创建人id、商品id等,在页面查询时我们需要将对应的id信息转换成对应的中文描述,比如用户中文名称,商品中文名称等。如果是单条数

在工作中,我们经常有这样的业务情况,实体间通过id实现数据业务上的关联,比如订单和用户,订单的创建人id、商品id等,在页面查询时我们需要将对应的id信息转换成对应的中文描述,比如用户中文名称,商品中文名称等。如果是单条数据的展示还好,但是设计到列表查询,如何高效、优雅地实现这个效果呢?4J928资讯网——每日最新资讯28at.com

现在接口返回的数据基本都是JSON格式,比如spring中使用了jackson,在controller层对结果进行json序列化,而我们要做的就是在序列化的过程中,实现id的转换4J928资讯网——每日最新资讯28at.com

使用方式

定义实体转换接口

由于需要对订单实体中的创建人id进行转换4J928资讯网——每日最新资讯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的处理,基于缓存实现,同时支持一个实体中多个,比如商品名称、商品分类等4J928资讯网——每日最新资讯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;    }}

需要转换的数据缓存

该实现依赖缓存,需要优先对需要转换的数据进行缓存,因此示例中添加了缓存示例4J928资讯网——每日最新资讯28at.com

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

实体定义

实体中需要通过实现接口UserConvert,这样对多个数据项转换时可以继续扩展4J928资讯网——每日最新资讯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*方法4J928资讯网——每日最新资讯28at.com

{    "id": "1",    "name": "测试订单",    "createTime": "2024-05-08T21:55:51.5747507",    "creator": "u1",    "userConvert": "Tom"}

实现原理

上面说的,主要实现基于缓存,在web查询结果进行json序列化时,依赖于jackson的扩展,对输出结果匹配的类型进行转换。4J928资讯网——每日最新资讯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://www.28at.com/showinfo-26-88739-0.html一招教你解决页面中关联id的转换

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React 中的国际化优秀实践

下一篇: 怪不得这么多人学 React!

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    7月28日,全球数字娱乐领域最具知名度与影响力的年度盛会中国国际数码互动娱乐展览会(简称ChinaJoy)在上海新国际博览中心盛大开幕。作为全球领先的科
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
Top