千家信息网

Java中ModelMapper的高级使用方法有哪些

发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,本篇内容介绍了"Java中ModelMapper的高级使用方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,
千家信息网最后更新 2024年09月21日Java中ModelMapper的高级使用方法有哪些

本篇内容介绍了"Java中ModelMapper的高级使用方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

ModelMapper 高级使用

  ModelMapper 是一个 Object To Object 的工具,类似于 MapStruct又不同于 MapStruct。主要原因是 ModelMapper 是利用反射的原理实现的 Object To Object。

使用实例

本实例实现了条件映射、嵌套映射(对象中有对象映射)、自定义属性映射、List 集合映射(对象中有集合映射)、Map集合映射(对象中有集合映射)、忽略映射,默认值设置(ModelMapper 的默认值设置时一不小心就会入坑,如果直接设置默认值,当再赋值转换时,默认值会覆盖赋值的值,所以设置默认值需要结合条件映射)等。
验证了对象属性为集合,集合中还有集合能够使用 ModelMapper 进行转换。不足点是这个实例中没有验证有继承关系时的映射(使用 modelMapper.includeBase(父类1, 父类2) 方法),多个属性映射为一个属性或一个属性映射为多个属性(使用 PropertyMap 转换器)。

  • 使用条件映射设置默认值。当 age/createTime 没有值时设置默认值为18/当前时间,有值时不设置默认值;

  • 嵌套映射,自定义属性映射。Source 的 sourceSon 成员变量 映射到 Destination 的 destinationSon 成员变量;

  • List集合映射。Source 的 listSon 成员变量 映射到 Destination 的 sonList 成员变量;

  • Map集合映射。Source 的 mapSon 成员变量 映射到 Destination 的 sonMap 成员变量;

  • 忽略映射。忽略 Destination 的 excessParam 成员变量,如果不忽略将验证不过,报 org.modelmapper.MappingException: ModelMapper mapping errors;

实体类

(1)BaseClass

@Getter@Setterpublic class BaseClass {    private String id;    private String name;    public BaseClass() {    }    public BaseClass(String id, String name) {        this.id = id;        this.name = name;    }}

(2)SouSubClass

@Getter@Setterpublic class SouSubClass {    private String sonId;    private String sonName;    private List grandSons;    public SouSubClass() {    }    public SouSubClass(String sonId, String sonName) {        this.sonId = sonId;        this.sonName = sonName;    }}

(3)DestSubClass

@Getter@Setterpublic class DestSubClass {    private String dsonId;    private String sonName;    private String excessParam;    private List grandSons;    public DestSubClass(){    }    public DestSubClass(String dsonId, String sonName) {        this.dsonId = dsonId;        this.sonName = sonName;    }}

(4)Source

@Getter@Setterpublic class Source {    private String id;    private String name;    private Integer age;    private SouSubClass sourceSon;    private List listSon;    private Map mapSon;    private Date createTime;    public Source() {    }    public Source(String id, String name) {        this.id = id;        this.name = name;    }    public Source(String id, String name, Integer age) {        this.id = id;        this.name = name;        this.age = age;    }}

(5)Destination

@Getter@Setterpublic class Destination {    private Long id;    private String name;    private Integer age;    private DestSubClass destinationSon;    private List sonList;    private Map sonMap;    private String excessParam;    private Date createTime;    public Destination() {    }    public Destination(Long id, String name) {        this.id = id;        this.name = name;    }}

ModelMapper 配置类

/** * 描述:ModelMapper 配置 */@Configurationpublic class ModelMapperConfig {    @Bean    @Scope("singleton")    public ModelMapper getModelMapper() {        ModelMapper modelMapper = new ModelMapper();        //默认为standard模式,设置为strict模式        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);        // 类型映射代码        sourceSonToDestinationSon(modelMapper);        sourceToDestination(modelMapper);        //验证映射        modelMapper.validate();        // 配置代码        return modelMapper;    }    /**     * 描述:声明 Source 类转 Destination 类的 Mapper     * @param modelMapper     * @Date  2019/05/09     */    private void sourceSonToDestinationSon(ModelMapper modelMapper) {        modelMapper.createTypeMap(SouSubClass.class, DestSubClass.class)                .addMapping(SouSubClass::getSonId, DestSubClass::setDsonId)                .addMapping(SouSubClass::getSonName, DestSubClass::setSonName)                .addMappings(mapper -> mapper.skip(DestSubClass::setExcessParam));    }    private void sourceToDestination(ModelMapper modelMapper) {        modelMapper.createTypeMap(Source.class, Destination.class)                .addMappings(mapper -> mapper.using((Converter) context -> {                        if (context.getSource() == null) {                            return 18;                        }                        return context.getSource();                    }).map(Source::getAge, Destination::setAge))                .addMappings(mapper -> mapper.using((Converter) context -> {                        if (context.getSource() == null) {                            return new Date();                        }                        return context.getSource();                    }).map(Source::getCreateTime, Destination::setCreateTime))                .addMapping(Source::getSourceSon, Destination::setDestinationSon)                .addMapping(Source::getListSon, Destination::setSonList)                .addMapping(Source::getMapSon, Destination::setSonMap)                .addMappings(mapper -> mapper.skip(Destination::setExcessParam));    }}

ModelMapper Service 类

public interface TestService {    Destination testSourceToDestination(Source source);    List testSourceToDestinationList(List sources);}
@Servicepublic class TestServiceImpl implements TestService {    @Autowired    private ModelMapper modelMapper;    @Override    public Destination testSourceToDestination(Source source) {        Destination destination = modelMapper.map(source, Destination.class);        return destination;  // a 处    }    @Override    public List testSourceToDestinationList(List sources) {        Type type = new TypeToken>(){}.getType();        List destinations = modelMapper.map(sources, type);        return destinations; // b 处    }}

测试类

@RunWith(SpringRunner.class)@SpringBootTest(classes = TestApplication.class)public class TestServiceImplTest {    @Autowired    private TestService testService;    private static Source source1 = new Source("a", "发生的", 24);    private static Source source2 = new Source("b", "发生的");    private static List sources = new ArrayList<>();    static {        List baseClasses1 = new ArrayList<>();        baseClasses1.add(new BaseClass("aa", "发生的111"));        baseClasses1.add(new BaseClass("bb", "发生的222"));        SouSubClass subClass1 = new SouSubClass("aaa", "发生的3333");        subClass1.setGrandSons(baseClasses1);        List baseClasses2 = new ArrayList<>();        baseClasses2.add(new BaseClass("cc", "国防观"));        baseClasses2.add(new BaseClass("dd", "国防观"));        SouSubClass subClass2 = new SouSubClass("ccc", "规范的大哥");        subClass2.setGrandSons(baseClasses2);        List sourceSonList = new ArrayList<>();        sourceSonList.add(subClass1);        sourceSonList.add(subClass2);        Map sourceSonMap = new HashMap<>();        sourceSonMap.put(1, subClass1);        sourceSonMap.put(2, subClass2);        source1.setCreateTime(new Date(System.currentTimeMillis()-98978609));        source1.setSourceSon(subClass1);        source1.setListSon(sourceSonList);        source1.setMapSon(sourceSonMap);        source2.setSourceSon(subClass1);        source2.setListSon(sourceSonList);        source2.setMapSon(sourceSonMap);        sources.add(source1);        sources.add(source2);    }    @Test    public void testSourceToDestination() {        testService.testSourceToDestination(source1);        testService.testSourceToDestination(source2);    }    @Test    public void testSourceToDestinationList() {        testService.testSourceToDestinationList(sources);    }}

测试结果

在 ab 两处打上断点,查看变量转换前后的值,证实转换成功。

"Java中ModelMapper的高级使用方法有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

变量 属性 成员 对象 验证 高级 方法 实例 条件 配置 使用方法 代码 内容 国防 国防观 多个 更多 模式 知识 测试 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 盘锦市公安局网络安全保卫支队 服务器dhcp地址查看 达梦数据库前台启动 生产安全风险数据库辨识模板 深圳中金众联互联网科技集团 数据库用哪本书好 银河帝国进游戏服务器加载中 进入考勤机数据库 数据库四大范式判断 人社局网络安全责任追究制度 php 异步执行数据库 学校网络安全情况记载报告 宿迁环保网络技术哪家好 艾尔登法环 无法登录游戏服务器 如何促进国家网络安全技术进步 软件开发岗位需要什么要求 网络安全竞赛培训视频 数据库numerical 我的世界网易版租赁服务器指令 数据库刘姓女职工查询 不想做软件开发能做什么 1902国家电网网络安全 redis属于关系型数据库 网信办网络安全局胡啸 数据库属于区块链技术吗 学校网络安全情况记载报告 网络安全设备 有那些 阴阳师怎么看我的服务器 怎样卸载t3数据库 中国水稻数据库九稻722
0