7

我正在尝试迁移一个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());
4

2 回答 2

1

快速回答:此功能没有内置支持。

但是有一个很好的理由,基本上是因为通常不同的上下文意味着需要创建不同的类(定义明确的职责)。第二点是在对象的深层图中,Orika 重用了类映射的相同定义。因此,上下文可能不取决于类图的情况,而是取决于更大的基础图图。

当您有超出同一个类的简单“重用”或一些定义明确的场景之外的严肃用例时,我建议您在每个场景中使用专用的 MapperFactory。

例如,当通过 REST API、方法 GET(列表)/GET(详细信息)/POST/PUT 公开服务时,您可以为每个服务提供一个专用的 Mapper。

恕我直言,在实体和 DTO 的情况下...... DTO 是一种为类型元组命名的合同。对同一个类进行上下文化使用会导致很多关于代码的隐藏知识。为每个用例设置一个特定的类是迈向良好设计的一个(小而重要的)步骤。

于 2013-06-13T22:38:08.957 回答
1

您可能希望在 Orika 中创建多个 MapperFacade,并在每种情况下使用适当的 MapperFacade。

另一种使用自定义映射器的方法,在这种情况下,您可以在映射上下文中传递一些东西,检查此上下文参数并根据该标志在您的自定义映射中执行映射。

于 2016-11-16T13:00:17.453 回答