我想迁移使用项目dozer来orika.
在推土机中,这是一种常见的做法:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping map-id="all">
<class-a>com.bnppa.cdj.dto.Source</class-a>
<class-b>com.bnppa.cdj.dto.Destination</class-b>
<field>
<a>id</a>
<b>id</b>
</field>
<field>
<a>someField</a>
<b>someField</b>
</field>
</mapping>
<mapping map-id="small">
<class-a>com.bnppa.cdj.dto.Source</class-a>
<class-b>com.bnppa.cdj.dto.Destination</class-b>
<field>
<a>id</a>
<b>id</b>
</field>
</mapping>
</mappings>
Run Code Online (Sandbox Code Playgroud)
然后在转换对象时使用mapId:
Source s = ...
List<String> mappingFiles = new ArrayList<String>();
mappingFiles.add("dozer/dozerMapping.xml");
mapper = new DozerBeanMapper(mappingFiles);
Destination d = mapper.map(mySource, Destination.class, "small");
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如何配置Orika来拥有这样的mapId东西?
在定义我的映射器时,我找不到如何声明map-id:
MapperFactory factory = new DefaultMapperFactory.Builder().build();
//Register a mapper
factory.registerClassMap(factory.classMap(Source.class, Destination.class)
.field("id","id")
.field("someField", "someField")
.toClassMap());
Run Code Online (Sandbox Code Playgroud)
快速回答:没有对此功能的内置支持。
但有充分的理由,基本上是因为通常不同的上下文意味着需要创建不同的类(明确定义的责任)。第二点是在对象的深层图中 Orika 重用了类映射的相同定义。因此,上下文可能不依赖于类映射的情况,而是依赖于更大的基础图映射。
当您有超出同一个类的简单“重用”或一些定义明确的场景之外的严肃用例时,我会建议您为每个场景使用专用的 MapperFactory。
例如,当通过 REST API、方法 GET(列表)/ GET(详细信息)/POST/PUT 公开服务时,您可以为每个方法拥有一个专用的映射器。
恕我直言,就实体和 DTO 而言……DTO 是一种为类型化元组命名的契约方式。在上下文中使用同一个类会导致代码中隐藏大量知识。为每个用例指定一个特定的类是迈向良好设计的一步(虽小但很重要)。
| 归档时间: |
|
| 查看次数: |
3209 次 |
| 最近记录: |