我正在构建一个Sprint引导应用程序,我在其中发出请求,然后得到响应。 在发出请求之前,我需要转换我的数据。但是,对于相同的Source类而言,要转换的Destination类可能会有所不同。 示例:
public Request getTransformedRequest(Request, String typeTransformation) {
Request transformedRequest= mapper.map(request,Request.class);
return transformedRequest;
}
如果我不使用Converters,而我仅使用普通的Dozer映射,则可以在我的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示例中的)转换器。 我真的很感谢您的帮助。谢谢您。
答案 0 :(得分:0)
自定义转换器通常用于字段级别,以在一对类的总体映射中为特定字段对的映射提供客户。在这种形式下,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>
还可以在类型级别配置自定义转换器,使转换器负责整个映射。与映射相反,这必须在Dozer配置中完成。请注意,在这种情况下,转换器负责整个映射。
<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>
有关定制转换器的更多信息,请参见推土机文档。 https://dozermapper.github.io/user-guide.pdf