【问题标题】:Dozer ,how to use Custom Converter by Id?推土机,如何按 ID 使用自定义转换器?
【发布时间】:2019-10-08 19:03:15
【问题描述】:

我正在构建一个 Sprint 启动应用程序,我在其中提出请求,然后得到响应。 在我提出请求之前,我需要转换我的数据。但是,对于要转换的同一个 Source 类,要转换的 Destination 类可能会有所不同。 示例:

    public Request getTransformedRequest(Request, String typeTransformation) {
        Request transformedRequest= mapper.map(request,Request.class);
        return transformedRequest;
}

如果我没有使用转换器,而我只使用普通的推土机映射,我可以在我的 mapping.xml 中包含以下内容;

<mapping map-id="Type1">
  <class-a>ClassA</class-a>
  <class-b>ClassB</class-b>   
</mapping> 
<mapping map-id="Type2">
 <class-a>ClassA</class-a>
 <class-b>ClassC</class-b>   
</mapping> 

然后在我的代码中,对于同一个 Source 类,我可以使用映射 ID 进行切换;

  ClassB mapper.map(request,Request.class,"Type1"); //Here ClassB extends Request
  ClassC mapper.map(request,Request.class,"Type2"); //Here ClassC extends Request

我的问题,我不能对转换器做同样的事情。我想为同一个源类使用不同的转换器:

  <convertertype="CustomConverterType1" >
    <class-a>
      ClassA
    </class-a>
    <class-b>
      ClassB
    </class-b>
  </converter>
 <converter type="CustomConverterType2" >
    <class-a>
      ClassA
    </class-a>
    <class-b>
      ClassC
    </class-b>
  </converter>

所以,在我的场景中,我想选择(如在映射 id 示例中),我希望的转换器。 我非常感谢同样的帮助。在此先感谢。

【问题讨论】:

    标签: spring dozer


    【解决方案1】:

    自定义转换器通常在字段级别使用,以在一对类的整体映射中为特定字段对定制映射。在此表单中,Dozer 执行其余的映射并仅针对具有客户转换器的字段调用您的转换器。

    <mapping>
        <class-a>ClassA</class-a>
        <class-b>ClassB</class-b>
        <field custom-converter="CustomConverterType1">
            <a>field1</a>
            <b>field1Prime</b>
        </field>
    </mapping>
    <mapping>
        <class-a>ClassA</class-a>
        <class-b>ClassC</class-b>
        <field custom-converter="CustomConverterType2">
            <a>field1</a>
            <b>field1Prime</b>
        </field>
    </mapping>
    

    还可以在类型级别配置自定义转换器,让转换器负责整个映射。这必须在推土机配置中完成,而不是映射。请注意,在这种情况下,转换器负责整个映射。

    <configuration>
        <custom-converters>
            <converter type="CustomConverterType1">
                <class-a>ClassA</class-a>
                <class-b>ClassB</class-b>
            </converter>
            <converter type="CustomConverterType2">
                <class-a>ClassA</class-a>
                <class-b>ClassC</class-b>
            </converter>
        </custom-converters>
    </configuration>
    

    有关自定义转换器的更多信息,请参阅 Dozer 文档。 https://dozermapper.github.io/user-guide.pdf

    【讨论】:

    • 嗨!谢谢 !是的,我知道,但我想在类型级别使用转换器,但对同一对使用不同的转换器,在运行时选择我想要的转换器。我可以对映射 ID 执行相同操作,但我想对转换器执行此操作。提前致谢!
    • 为什么要使用推土机呢?为什么不直接从您的代码中根据您的条件调用正确的转换器?
    • 因为我想使用推土机功能。谢谢!
    • 我一定错过了什么。通过在顶层类型映射中使用自定义转换器,转换器完成了所有工作,从而绕过了 Dozer 的功能。除了调用推土机,推土机又会调用你的自定义转换器之外,推土机在哪里发挥作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多