我正在尝试将使用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>
然后在转换对象时使用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");
所以我的问题是:如何配置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());
答案 0 :(得分:1)
快速回答:此功能没有内置支持。
但是有充分的理由,主要是因为通常不同的上下文意味着需要创建不同的类(明确的责任)。第二点是对象的深度图,Orika重用了类映射的相同定义。因此,上下文可能不依赖于类映射的情况,而是依赖于更大的基础图 - 映射。
如果你有一个严重的用例,超出了同一个类的简单“重用”或一些定义良好的场景,我建议你在每个场景中使用一个专用的MapperFactory。
例如,当通过REST API公开服务时,方法GET(列表)/ GET(详细信息)/ POST / PUT,您可以拥有一个专用的Mapper。
恕我直言,就实体和DTO而言...... DTO是一种给类型化元组命名的合同。对相同类进行语境化使用会导致围绕代码的大量隐藏知识。为每个用例设置一个特定的类是实现良好设计的一个(小而重要的)步骤。
答案 1 :(得分:1)
您可能想在Orika中创建多个MapperFacades,并在每种情况下使用适当的MapperFacade。
使用自定义映射器的另一种方法,在这种情况下,您可以在映射上下文中传递某些内容,检查此上下文参数并根据该标志在自定义映射中执行映射。