千家信息网

Springboot如何整合Dozer实现深度复制

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章将为大家详细讲解有关Springboot如何整合Dozer实现深度复制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。DozerDozer是一种Java Be
千家信息网最后更新 2024年09月22日Springboot如何整合Dozer实现深度复制

这篇文章将为大家详细讲解有关Springboot如何整合Dozer实现深度复制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。


Dozer

Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通用的,灵活的,可重用的和可配置的开源映射框架。

常用于:

  • 代码层与层之间javabean转换, 如dao层PO转前端VO

  • 分布式中, DAO层PO转DTO, DO 以及web层DTO转VO

注意的场景:

  • 由于bean之间的深度复制, 在进行一些类似更新, 插入操作时尤其要注意最终接收到PO的一些关键字段如ID是否是真正需要的. 场景: 传入的DTO A为查出的DTO B复制后的, 这时候A里会有B的ID, 在插入A的时候很有可能造成主键冲突.

建议:

  • 不用Dozer最好, Dozer带来的是性能开销.(这是不可能…)

  • 某些特殊操作可以用切面控制特殊字段进行置空操作

SpringBoot整合Dozer

jar依赖引入

pom.xml加入以下依赖

    net.sf.dozer    dozer-spring    5.5.1    net.sf.dozer    dozer    5.5.1

dozer配置xml引入

resource文件夹下新建dozer文件夹, 并新建bean-mappings.xml, global-configuration.xml

bean-mappings.xml

global-configuration.xml

            yyyy-MM-dd HH:mm:ss              true        false                                            java.lang.Enum                java.lang.Integer                        

Dozer的JavaConfig

用于SpringBoot寻找DozerBeanMapperFactoryBean的配置
新建DozerMapperConfig.java

public class DozerMapperConfig {    @Bean    public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:dozer/*.xml") Resource[] resources) throws Exception {        final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();        dozerBeanMapperFactoryBean.setMappingFiles(resources);        return dozerBeanMapperFactoryBean;    }}

格式化工厂

建议新建包专门放置Dozer工具

接口定义: 新建IGenerator.java接口

public interface IGenerator {    /**      * @Description: 单个对象的深度复制及类型转换,vo/domain , po     * @param s 数据对象     * @param clz 复制目标类型     * @return     * @author banjuer@outlook.com     * @Time 2018年5月9日 下午3:53:24     */     T convert(S s, Class clz);    /**     * @Description       : 深度复制结果集(         ResultSet    为自定义的分页结果集)     *    @param s 数据对象            ResultSet    convert(    s, Class clz);  /**      * @Description: list深度复制     * @Time 2018年5月9日 下午3:54:08     List convert(List s, Class clz);     * @Description: set深度复制     * @Time 2018年5月9日 下午3:54:39     Set convert(Set s, Class clz);     * @Description: 数组深度复制     * @Time 2018年5月9日 下午3:54:57     T[] convert(S[] s, Class clz);}

IGenerator实现

@Component@Lazy(true)public class EJBGenerator implements IGenerator {    @Autowired    protected Mapper dozerMapper;    public  T convert(S s, Class clz) {        if (s == null) {            return null;        }        return this.dozerMapper.map(s, clz);    }     public              ResultSet      convert   (    s, Class clz) {       if (s == null) {     return null   ;     }    resultSet    =   new   ();  for    (S vs : s.getResult()) {   .getResult().add(  this   .dozerMapper.map(vs, clz));   .setTotal(s.getTotal());   .setExt(s.getExt());   .setModifyTime(s.getModifyTime());  return      public  List convert(List s, Class clz) {        List list = new ArrayList();        for (S vs : s) {            list.add(this.dozerMapper.map(vs, clz));        return list;    public  Set convert(Set s, Class clz) {        Set set = new HashSet();            set.add(this.dozerMapper.map(vs, clz));        return set;    public  T[] convert(S[] s, Class clz) {        @SuppressWarnings("unchecked")        T[] arr = (T[]) Array.newInstance(clz, s.length);        for (int i = 0; i < s.length; i++) {            arr[i] = this.dozerMapper.map(s[i], clz);        return arr;}

使用Demo

一般在公共父类中引入, 此处例子为前端公共Controller引入

@Controllerpublic class BaseController  {    @Autowired    protected EJBGenerator ejbGenerator = new EJBGenerator();    protected final Logger logger = LoggerFactory.getLogger(getClass());}
// 个人信息变更记录sessionSessionUserDetails userDetails = ejbGenerator.convert(userVo, SessionUserDetails.class);

关于"Springboot如何整合Dozer实现深度复制"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0