dozer做model映射

本文详细介绍如何在项目中配置Dozer工具进行自动对象转换,包括Maven依赖、配置类、枚举转换器、工具类及XML配置,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中要经常转换model, 有了自动转换无疑是最优雅, 最有效率的工具

maven pom.xml

<dependency>
	<groupId>net.sf.dozer</groupId>
	<artifactId>dozer-spring</artifactId>
	<version>5.5.1</version>
</dependency>
<dependency>
	<groupId>net.sf.dozer</groupId>
	<artifactId>dozer</artifactId>
	<version>5.5.1</version>
</dependency>

DozerConfig.java

package com.xxx.xxx.config.dozer;

import org.dozer.spring.DozerBeanMapperFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;

@Configuration
public class DozerConfig {

    @Value("classpath*:dozer/*.xml")
    private Resource[] resources;

    @Bean
    public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean() {
        DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
        dozerBeanMapperFactoryBean.setMappingFiles(this.resources);
        return dozerBeanMapperFactoryBean;
    }

}

DozerEnumConverter.java (对枚举的支持)

package com.xxx.xxx.config.dozer;

import com.xxx.xxx.enums.BaseEnum;
import org.dozer.CustomConverter;
import org.dozer.MappingException;

import java.util.Objects;

public class DozerEnumConverter implements CustomConverter {


    @Override
    public Object convert(Object destination, Object source, Class<?> destinationClass, Class<?> sourceClass) {
        if (source == null) {
            return null;
        }
        if (source instanceof BaseEnum) {
            return ((BaseEnum) source).getCode();
        } else if (source instanceof Integer && destinationClass.isEnum()) {
            BaseEnum[] enums = (BaseEnum[]) destinationClass.getEnumConstants();
            for (final BaseEnum e : enums) {
                if (Objects.equals(e.getCode(), source)) {
                    return e;
                }
            }
        } else {
            throw new MappingException(String.format(
                    "Converter %s was used incorrectly. Arguments were: %s and %s",
                    this.getClass().getSimpleName(), destinationClass.getName(), source
            ));
        }
        return null;
    }


}

DozerMapperFactory.java (封装一个转换工具, 便于使用)

package com.xxx.xxx.config.dozer;

import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Component
public class DozerMapperFactory {

    @Autowired
    protected Mapper dozerMapper;

    /**
     * 单个对象的深度复制及类型转换
     * @param source 数据对象
     * @param targetClass 复制目标类型
     */
    public <T, S> T convert(S source, Class<T> targetClass) {
        if (source == null) {
            return null;
        }
        return this.dozerMapper.map(source, targetClass);
    }

    /**
     * list深度复制
     * @param sources 数据对象
     * @param targetClass 复制目标类型
     */
    public <T, S> List<T> convert(List<S> sources, Class<T> targetClass) {
        if (sources == null) {
            return null;
        }
        List<T> list = new ArrayList<T>();
        for (S source : sources) {
            list.add(this.dozerMapper.map(source, targetClass));
        }
        return list;
    }
    /**
     * set深度复制
     * @param sources 数据对象
     * @param targetClass 复制目标类型
     */
    public <T, S> Set<T> convert(Set<S> sources, Class<T> targetClass) {
        if (sources == null) {
            return null;
        }
        Set<T> set = new HashSet<T>();
        for (S source : sources) {
            set.add(this.dozerMapper.map(source, targetClass));
        }
        return set;
    }

    /**
     * 数组深度复制
     * @param sources 数据对象
     * @param targetClass 复制目标类型
     */
    public <T, S> T[] convert(S[] sources, Class<T> targetClass) {
        if (sources == null) {
            return null;
        }
        @SuppressWarnings("unchecked")
        T[] array = (T[]) Array.newInstance(targetClass, sources.length);
        for (int i = 0; i < sources.length; i++) {
            array[i] = this.dozerMapper.map(sources[i], targetClass);
        }
        return array;
    }

}

resource中xml配置文件

dozer/global-configuration.xml

<?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">

    <configuration>
        <date-format>yyyy-MM-dd HH:mm:ss</date-format>
        <wildcard>true</wildcard>
        <trim-strings>false</trim-strings>
        <custom-converters>
            <converter type="com.xxx.xxx.config.dozer.DozerEnumConverter">
                <class-a>com.xxx.xxx.enums.BaseEnum</class-a>
                <class-b>java.lang.Integer</class-b>
            </converter>
        </custom-converters>

    </configuration>

</mappings>

dozer/bean-mappings.xml

<?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>
        <class-a>com.xxx.xxx.entity.User</class-a>
        <class-b>com.xxx.xxx.model.UserModel</class-b>
        <field>
            <a>id</a>
            <b>userId</b>
        </field>
    </mapping>

</mappings>

dozer的配置到这里就结束了

转载于:https://my.oschina.net/yehun/blog/3047642

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值