3

有没有办法在 Dozer 中定义一个自定义转换器,用于将一种顶级类型转换为另一种类型,它本身就是一个 Spring bean,因此可以注入它的依赖项?

dozer 文档建议添加以下 XML 定义:

  <converter type="org.dozer.converters.TestCustomConverter" >
    <class-a>org.dozer.vo.CustomDoubleObject</class-a>
    <class-b>java.lang.Double</class-b>
  </converter>

不幸的是,这会导致 Dozerorg.dozer.converters.TestCustomConverter直接实例化,这将跳过依赖注入。有没有办法引用 Spring bean?

4

6 回答 6

9

在上一个答案中的 CustomConverterWithIds 旁边,还可以注入自定义转换器以覆盖映射文件配置部分中定义的转换器。这样,dozer 将使用注入的转换器,而不是使用默认构造函数实例化一个。

<bean id="dozerMapper" class="org.dozer.DozerBeanMapper" scope="singleton">
    <property name="mappingFiles">
        <list>
            <value><mapping-file-name1></value>
            <value><mapping-file-name2></value>
        </list> 
    </property>
    <property name="customConverters">
        <list>
            <ref bean="entityConverter"/>
        </list>
    </property>
</bean>

<configuration>
   <custom-converters>
     <converter type="my.domain.EntityConverter">
        <class-a>java.lang.Integer</class-a>
        <class-b>my.domain.MyEntity</class-b>
     </converter>
   <custom-converters>
</configuration>

<beans   .... >
   <bean id="entityConverter" class="my.domain.EntityConverter">
        <property ....
   </bean
</beans>
于 2011-09-09T11:26:35.007 回答
4

如果您的自定义转换器是 spring bean,则 Dozer bean 映射器的属性“customConvertersWithIds”可用于引用转换器 spring bean。然后使用此 id 来引用映射中的自定义转换器。以下是我如何让它为我工作:

<bean id="dozerMapper" class="org.dozer.DozerBeanMapper" scope="singleton">
        <property name="mappingFiles">
            <list>
                <value><mapping-file-name1></value>
                <value><mapping-file-name2></value>
            </list>
        </property>
        <property name="customConvertersWithId">
            <map>
                <entry key="crbConverter" value-ref="loadableFooBeanConverter"/>
                <entry key="sbConverter" value-ref="loadableXyzBeanConverter"/>
            </map>
        </property>
    </bean>

我对转换器类进行了注释,例如 @component("loadableFooBeanConverter")

映射示例:

<mapping>
        <class-a>${Abc}</class-a>
        <class-b>${AbcBean}</class-b>
           <field custom-converter-id="sbConverter">
            <a>XyzId</a>
            <b>Xyz</b>
            <b-hint>${XyzBean}</b-hint>
        </field>
</mapping>
于 2011-09-06T19:54:57.853 回答
0

不幸的是,这不受支持。

于 2011-07-21T17:17:23.523 回答
0

为了将 Spring bean 作为自定义转换器注入,我修补了原始的 Dozer。如果您可以接受,您可以查看我的更改并使用它们。更新的源代码位于https://bitbucket.org/JRS/open-dozer

您仍然需要将自定义转换器记录添加到全局配置中。

于 2012-01-17T08:00:06.387 回答
0

为了改进@Chris 的答案,您可以直接引用类以避免声明 bean。

在 dozer bean 声明中声明您的自定义转换器 bean。

<bean id="DozerMapper" class="org.dozer.DozerBeanMapper">
    <property name="mappingFiles">
        <list>
            <value>mapping.xml</value>
        </list>
    </property>
    <property name="customConverters">
        <list>
            <bean class="com.pharmagest.monalisa.rest.service.mapper.MyConverter"/>
        </list>
    </property>
</bean>

在配置中声明您的映射后(对我来说,在 mapping.xml 文件中)。

<configuration>
        <stop-on-errors>true</stop-on-errors>
        <date-format>MM/dd/yyyy HH:mm</date-format>
        <wildcard>true</wildcard>
        <custom-converters>
            <converter type="com.pharmagest.monalisa.rest.service.mapper.MyConverter">
                <class-a>com.project.ClassA</class-a>
                <class-b>com.project.ClassB</class-b>
            </converter>
        </custom-converters>
</configuration>
于 2017-03-17T10:04:29.483 回答
0

对于 Gunjan 的回答,Spring Boot 中的 Java 配置如下:

将自定义转换器创建为 bean,如下所示:

@Component
public class LoadableFooBeanConverter extends DozerConverter<BarBean, FooBean> {
    private final Util util; // Any beans that need to be injected into the custom converter

    @Autowired // Constructor Injection
    public LoadableFooBeanConverter(Util util) {
        super(BarBean.class, FooBean.class);
        this.util = util;
    }

    @Override
    public FooBean convertTo(final BarBean source, final FooBean destination) {
        // Your logic
    }

    @Override
    public BarBean convertFrom(final FooBean source, final BarBean destination) {
        // Your logic
    }
}

创建 Mapper 组件并注册自定义转换器,如下所示:

@Component
@RequiredArgsConstructor // lombok annotation
public class DozerMapper {
    @Autowired
    private final LoadableFooBeanConverter loadableFooBeanConverter;

    @Getter // lombok annotation
    private Mapper mapper;

    @PostConstruct
    public void init() {
        this.mapper = DozerBeanMapperBuilder.create()
                .withMappingBuilders(BarMappingBuilder.builder().build())
                .withCustomConverterWithId("loadableFooBeanConverter", loadableFooBeanConverter)
                .build();
    }

    @Builder // lombok annocation
    private static class BarMappingBuilder extends BeanMappingBuilder {
        @Override
        protected void configure() {
            mapping(FooBar.class, FooBarFoo.class)
                    .fields("fooBean", "barBean", FieldsMappingOptions.customConverterId("loadableFooBeanConverter"));
        }
    }
}
于 2019-09-26T14:09:16.503 回答