相信大家都会有这么一种感觉,阅读英文msdn文档的时候,会有一种朦胧的美感,哈哈,那么怎么把搜到的英文文档变为中文呢?

文件:url80.ctfile.com/f/25127180-604720859-44ceba?p=551685 (访问密码: 551685)


以下内容无关:

这个问题的核心有三点:

填充的数据源是不确定的:可能是来自于 RPC 接口,可能是枚举类,也可能是数据库里的配置表,甚至是配置文件;
填充对象是不确定的:可能是普通的对象,但是也可能是 Collection 集合,或者 Map 集合,甚至可能是个 JsonNode,或者有一个嵌套结构;
填充的字段的不确定的:同样的数据源,但是可能这个接口返回的对象只需要填其中的一个字段,但是另一个接口需要填另外的两个字段;
基于上述三点,我们在日常场景中很容易遇到下图的情况:

image-20220626150755256
image-20220626150755256
本文将推荐一个基于 spring 的工具类库 crane,它被设计用来通过类似 MapStruts 的注解配置,完成这种麻烦的关联数据填充/转换操作的处理。

一、crane 是用来做什么的?
1、举个例子
在开始前,我们先举个例子,假如我们有一个实体类 PersonVO 与 PersonDO:

@Data
public class PersonVO {
private Integer id;
private String personName;
}

@Data
public class PersonDO {
private Integer id;
private String name;
}
然后手头有一批待处理的 PersonVO 对象,我们需要从 PersonService 中根据 PersonVO.id 获取 PersonDO 集合,然后最后把 PersonDO.name 回填到 PersonVO.personName 中:

List targets = new ArrayList<>;

// 对targets按id分组
Map<Integer, PersonVO> targetMap = new HashMap<>();
targets.forEach(t -> targetMap.put(t.getId(), t));

// 对sources按id分组
List sources = personService.getByIds(targetMap.keySet());
Map<Integer, PersonDO> sourcesMap = new HashMap<>();
sources.forEach(s -> sourcesMap.put(s.getId(), s));

// 填充属性
targets.forEach((pid, target) -> {
PersonDO source = sourcesMap.get(pid);
if(source != null) {
target.setPersonName(source.getName())
}
})
总结一下,如果我们要手动处理,则无论如何避免不了四个步骤:

从目标对象中拿到 key 值;
根据 key 值从接口或者方法获得 key 值对应的数据源;
将数据源根据 key 值分组;
遍历目标对象,根据 key 值获取到对应的数据源,然后根据根据需要挨个 set 数据源的属性值;
2、使用crane解决上述问题
针对上述的情况,假如使用 crane ,则我们可以这么做:

第一步,为被填充的 PersonVO 添加注解,配置字段:

@Data
public class PersonVO {
@AssembleMethodSource(namespace = “person”, props = @Prop(src = “name”, ref = “personName”))
private Integer id;
private String personName;
}
第二步,在提供数据源的 PersonService 中为 getByIds 方法也添加一个注解,配置数据源:

public class PersonService {
@MethodSourceBean.Mehtod(namespace = “person”, sourceType = PersonDO.class, sourceKey = “id”)
public List getByIds(Set ids) {
// return somthing…
}
}
第三步,使用 crane 提供的 OperateTemplate 辅助类在代码里完成填充:

List targets = new ArrayList<>;
operateTemplate.process(targets);
或者直接在方法注解上添加一个注解,返回值将在切面中自动填充:

@ProcessResult(PersonVO.class)
public List getPersonVO() {
// return PersonVO list…
}
相比起纯手工填充,crane 带来的好处是显而易见的,PersonService 中用一个注解配置好了数据源后,就可以在任何需要的实体类上用一行注解搞定填充字段的需求。

当然,示例中原始的手动填充的写法仍然有很多优化的余地。不过对应的, crane 的功能也不仅只有这些,crane 还支持配置更多的数据源,不仅是接口,还能是本地缓存,枚举;关于 key 的映射关系,不止提供示例中的一对一,还支持一对多;而其中的字段映射,也支持更多的玩法,这些都会在下文一一介绍。

二、如何引入
crane 依赖于 springboot 环境,假如你是 springboot 项目,则只需要引入依赖:

top.xiajibagao crane-spring-boot-starter ${last-version} last-version 则是 crane 的版本号,截止至本文发布时,crane 的最新版本是 0.5.7。

然后在启动类添加 @EnableCrane 注解启用配置:

@EnableCrane
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
即可使用 crane 的全部功能。

三、配置使用
字段配置是 crane 最核心的配置,它一般由三部分组成:

指定的 key 值字段;
要使用的数据源容器;

MSDN帮助文档中文相关推荐

  1. vs2012 MSDN帮助文档离线包下载安装方法

    vs2012安装文件 自带的 MSDN帮助文档不全, 需要自己手动添加需要的离线文档包, 具体方法如下 1. 打开 vs2012 2. 按 ctrl + alt + F1 打开帮助文档管理器 3. 在 ...

  2. MSDN帮助文档安装失败解决方案

    笔者使用的是VS2008 SP1,想在VS中按F1打开帮助文档查询函数时 发现并未安装MSDN离线包,在官网上找到了MSDN包:https://download.microsoft.com/downl ...

  3. ReactiveX文档中文翻译

    ReactiveX/RxJava文档中文版 项目地址:https://github.com/mcxiaoke/RxDocs,欢迎Star和帮忙改进. 有任何意见或建议,到这里提出 Create New ...

  4. Ubuntu 11.04解决txt文档中文乱码方法

    Ubuntu 11.04解决txt文档中文乱码方法: $ gconftool-2 --set --type=list --list-type=string /apps/gedit-2/preferen ...

  5. MSDN帮助文档 无法显示该网页 的问题解决方案(转)

    MSDN帮助文档 "无法显示该网页" 的问题解决方案 以前就遇到过这样的问题,还以为是IE7导致的.后来重新安装了IE7也没有解决.后来就重新安装MSDN了,非常郁闷.今天终于知道 ...

  6. pinia中文文档 指导文档中文翻译版 pinia指导中文翻译

    Pinia 指导文档 中 文 翻 译 版 翻译者:jcLee95 Pinia 指导手册中文翻译地址(本文): https://blog.csdn.net/qq_28550263/article/det ...

  7. 孙鑫老师MFC视频使用的MSDN帮助文档下载及安装

    原文:https://blog.csdn.net/qq_34720818/article/details/102482315 孙鑫老师MFC视频使用的MSDN帮助文档下载及安装 前言: 孙鑫老师的这个 ...

  8. 为 VS 2012 打包 MSDN 在线文档为磁盘安装源

    本文的内容是分享打包 MSDN 在线文档为磁盘安装源的知识.如果您并不追求较新的参考文档,可以直接下载微软提供的 ISO 文件.好像是2.几个G,记不清了(下班回去后补上地址).[文末已补充地址] 我 ...

  9. NirCmd v2.37帮助文档中文译本

    NirCmd v2.37帮助文档中文译本 简述 NirCmd是一款命令行使用小工具,通过它可以完成很多实用的任务,而不用显示任何用户界面.通过添加一些非常简单的命令选项,可以完成:写入.删除 注册表项 ...

  10. 手机打开PDF文档中文英文支持(乱码问题)解决攻略

    手机打开PDF文档中文英文支持(乱码问题)解决攻略 参考文章: (1)手机打开PDF文档中文英文支持(乱码问题)解决攻略 (2)https://www.cnblogs.com/seachal/p/52 ...

最新文章

  1. 【组队学习】【31期】LeetCode 刷题
  2. Android异步消息机制
  3. springmvc中使用MockMvc测试controller
  4. Java 算法 质数的后代
  5. android textview 动态高度自适应,TextView自适应高度(解决_UITextContainerView布局问题)...
  6. 家庭记事本开发进度3
  7. python散点图拟合曲线如何求拟合_python 拟合曲线并求参
  8. 微软官方的.net系列文档
  9. 《手把手教你学DSP》总结1
  10. Oligo 7 引物设计 安装
  11. 软件测试 | 状态迁移法
  12. 自行车线控前叉换线之——鸡米螺丝
  13. 浅析json_encode
  14. 什么是商业智能 (BI) 仪表板?
  15. 各个击破!高效解决游戏开发8大痛点
  16. 特征图注意力_深入理解图注意力机制
  17. DEBUG 代码调试
  18. 100725B Banal Tickets
  19. python画一棵树的心理测试_【心理测试】画树测试:一棵树读你的人生
  20. python 图片/语音文件实现base64的转换与解析

热门文章

  1. QQ音乐.qmc3文件转换成正常mp3文件
  2. Java开发微信公众号后台
  3. cad批量打印快捷键_基础教程——CAD的批量打印功能
  4. python计算图片的信源熵值(信息熵)
  5. TFN FMT715C/ 760 C系列无线综合测试仪性能如何
  6. linux pe系统下载,WINPE LINUX DOS 完美者U盘维护系统V8.1 正式版
  7. linux spdbv教程,计算机化学实践基础教程
  8. 斐波那契数列(Fibonacci)的三种JAVA解法
  9. NC文件按时序维度拆分
  10. 在线考试系统详细设计