spring boot集成Dozer转换器

来源:互联网 发布:java输出两位小数 编辑:程序博客网 时间:2024/06/03 20:13

Dozer转换,一个强大的对象属性转换器,能够快速的在实体bean,vo,do之间转换,在项目中集成Dozer,能够让提升我们的开发速率,下面主要是说说在spring boot中的集成,其他框架类似。

1、添加maven依赖

<dependency>   <groupId>net.sf.dozer</groupId>   <artifactId>dozer</artifactId>   <version>5.4.0</version>   <exclusions>      <!--目前项目中使用的是apache自带的log4j-->      <exclusion>         <groupId>org.slf4j</groupId>         <artifactId>slf4j-log4j12</artifactId>      </exclusion>      <!--<exclusion>         <groupId>log4j</groupId>         <artifactId>log4j</artifactId>      </exclusion>-->   </exclusions></dependency>

2、创建Dozer bean,在真正的项目中,我们不能每使用一次就创建一个dozer转换实例,这样会大大降低系统的性能,所以一般都是创建单实例,并且交给spring 容器进行管理。

dozer集成官方文档中主要有三种方式。

A、使用注解方式

创建bean

@Configurationpublic class DozerBeanMapperConfigure {    @Bean    public DozerBeanMapper mapper() {        DozerBeanMapper mapper = new DozerBeanMapper();        return mapper;    }}

转换对象:

public class SourceBean {    private Long id;    private String name;    @Mapping("binaryData")    private String data;    @Mapping("pk")    public Long getId() {        return this.id;    }    public String getName() {        return this.name;    }} 
public class TargetBean {    private String pk;    private String name;    private String binaryData;    public void setPk(String pk) {        this.pk = pk;    }    public void setName(String name) {        this.name = name;    }}       

此种方式最简便,但是官方中只有一个注释@Mapping,因此只能应对简便的映射关系,官方提醒如下:

WARNING: Annotation support in Dozer is experimental and does not cover complex use cases yet. However it may be useful to implement that simplest mappings you have had to do in Xml or API before.

意思是如果想要使用更复杂的映射,就只能使用xml配置,或者API方式

B、使用API方式

此种方式在创建的时候需要制定对应的BeanMappingBuilder,

官方例子:

import static org.dozer.loader.api.FieldsMappingOptions.*;import static org.dozer.loader.api.TypeMappingOptions.*;...BeanMappingBuilder builder = new BeanMappingBuilder() {      protected void configure() {        mapping(Bean.class, Bean.class,                TypeMappingOptions.oneWay(),                mapId("A"),                mapNull(true)        )                .exclude("excluded")                .fields("src", "dest",                        copyByReference(),                        collectionStrategy(true,                             RelationshipType.NON_CUMULATIVE),                        hintA(String.class),                        hintB(Integer.class),                        FieldsMappingOptions.oneWay(),                        useMapId("A"),                        customConverterId("id")                )                .fields("src", "dest",                    customConverter("org.dozer.CustomConverter")                );      }    };
DozerBeanMapper mapper = new DozerBeanMapper();mapper.addMapping(builder);

个人例子:

@Configurationpublic class DozerBeanMapperConfigure {    @Bean    public DozerBeanMapper mapper(){        DozerBeanMapper mapper = new DozerBeanMapper();        mapper.addMapping(beanMappingBuilder);        mapper.addMapping(beanMappingBuilder1);        return mapper;    }    BeanMappingBuilder beanMappingBuilder = new BeanMappingBuilder() {        @Override        protected void configure() {            //a-->>b-->>a' ==>>a != a'            mapping(User.class, UserVo.class, TypeMappingOptions.oneWay())                    .fields("teacher.name","teacherName" );        }    };    BeanMappingBuilder beanMappingBuilder1 = new BeanMappingBuilder() {        @Override        protected void configure() {            mapping(User.class, UserVo2.class, TypeMappingOptions.oneWay())                    .fields("teacher.name","teacherName" );        }    };}
或者不想添加多个builder的话,也可以添加多个mapping(),如下:

@Configurationpublic class DozerBeanMapperConfigure {    @Bean    public DozerBeanMapper mapper(){        DozerBeanMapper mapper = new DozerBeanMapper();        mapper.addMapping(beanMappingBuilder);        return mapper;    }    BeanMappingBuilder beanMappingBuilder = new BeanMappingBuilder() {        @Override        protected void configure() {            //a-->>b-->>a' ==>>a != a'            mapping(User.class, UserVo.class, TypeMappingOptions.oneWay())                    .fields("teacher.name","teacherName" );            mapping(User.class, UserVo2.class, TypeMappingOptions.oneWay())                    .fields("teacher.name","teacherName" );        }    };}

此种方式,可以解决较为复杂的映射关系,基本可以满足项目的需求,但是官方的解释说,有些特殊的复杂关系,其实是只能使用XML配置的,所以官方更倾向于使用xml配置的方式,官方解释:API mappings are intended to solve all of the mentioned problems. In fact some parts of the configuration (e.g. global configuration block) are only possible to express in Xml format.

C、第三种方式,使用XML配置的方式,Xml配置虽然对异常等信息的提示很不足,但是在配置方面却很强大,官方极力推荐使用,

创建bean,需要制定需要加载的xmp配置文件的路径,并且需要制定到具体的文件名

@Configurationpublic class DozerBeanMapperConfigure {    @Bean    public DozerBeanMapper mapper() {        DozerBeanMapper mapper = new DozerBeanMapper();        mapper.setMappingFiles(Arrays.asList("mapping/UserMapping.xml"));        return mapper;    }}
对应的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 map-null="false">com.example.springboot.Entity.User</class-a>        <class-b map-null="false">com.example.springboot.EntityVo.UserVo</class-b>        <field>            <a>teacher.name</a>            <b>teacherName</b>        </field>    </mapping> </mappings>

此种方式可以解决Dozer转换的所有问题,当然,上面只是一个小小的例子,更多配置可参考官方文档:http://dozer.sourceforge.net/documentation/mappings.html,里面很详细的讲解Xml的各种配置问题










原创粉丝点击