如何配置Orika根据上下文将类映射到另一个?

时间:2013-06-13 08:28:01

标签: java orika

我正在尝试将使用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());

2 个答案:

答案 0 :(得分:1)

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

但是有充分的理由,主要是因为通常不同的上下文意味着需要创建不同的类(明确的责任)。第二点是对象的深度图,Orika重​​用了类映射的相同定义。因此,上下文可能不依赖于类映射的情况,而是依赖于更大的基础图 - 映射。

如果你有一个严重的用例,超出了同一个类的简单“重用”或一些定义良好的场景,我建议你在每个场景中使用一个专用的MapperFactory。

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

恕我直言,就实体和DTO而言...... DTO是一种给类型化元组命名的合同。对相同类进行语境化使用会导致围绕代码的大量隐藏知识。为每个用例设置一个特定的类是实现良好设计的一个(小而重要的)步骤。

答案 1 :(得分:1)

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

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