Dozer:用于实现JavaBean之间的映射与转换
官网:https://github.com/DozerMapper/dozer
Maven引入
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.4.0</version>
</dependency>
一、使用注解的方式
public class FromA
{
private long id;
@Mapping("value")
private String name;
private Date date;
@Override
public String toString()
{
return "FromA [id=" + id + ", name=" + name + ", date=" + date + "]";
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
}
public class FromB
{
private long id;
private String value;
private Date date;
@Override
public String toString()
{
return "FromB [id=" + id + ", value=" + value + ", date=" + date + "]";
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
}
类FromA的字段name通过注解@Mapping("value")和类FromB的字段value进行关联。
public static void main(String[] args)
{
DozerBeanMapper mapper = new DozerBeanMapper();//---------------------------------------对象转换
// FromA fromA = new FromA();
// fromA.setDate(new Date());
// fromA.setId(5L);
// fromA.setName("Aaaa");
//
// FromB fromB = mapper.map(fromA, FromB.class);
// System.out.println(fromB);FromB fromB = new FromB();
fromB.setDate(new Date());
fromB.setId(5L);
fromB.setValue("Aaaa");
FromA fromA = mapper.map(fromB, FromA.class);
System.out.println(fromA);
//---------------------------------------列表转换
// List<FromA> listA = new ArrayList<FromA>();
// listA.add(fromA);
//
// List<FromB> listB = (List)listA.stream()
// .map(objectA -> mapper.map(objectA, FromB.class))
// .collect(Collectors.toList());
//
// System.out.println(listB);List<FromB> listB = new ArrayList<FromB>();
listB.add(fromB);
List<FromA> listA = (List)listB.stream()
.map(objectB -> mapper.map(objectB, FromA.class))
.collect(Collectors.toList());//通过JAVA8流的方式,实现FromA和FromB集合之间的转换。
System.out.println(listA);
}
二、使用映射文件的方式
public class FromA
{
private long id;
private String name;
private Date date;
@Override
public String toString()
{
return "FromA [id=" + id + ", name=" + name + ", date=" + date + "]";
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
}
public class FromB
{
private long id;
private String value;
private Date date;
@Override
public String toString()
{
return "FromB [id=" + id + ", value=" + value + ", date=" + date + "]";
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
}
配置文件dozer-mapping.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 date-format="yyyy-MM-dd">
<class-a>test.dozer.FromA</class-a>
<class-b>test.dozer.FromB</class-b>
<field>
<a>name</a>
<b>value</b>
</field>
</mapping>
</mappings>
类FromA的字段name通过配置文件“dozer-mapping.xml”和类FromB的字段value进行关联。
public static void main(String[] args)
{
DozerBeanMapper mapper = new DozerBeanMapper();
List<String> myMappingFiles = new ArrayList<String>();
myMappingFiles.add("dozer-mapping.xml");//配置文件和@Mapping不可共用
mapper.setMappingFiles(myMappingFiles);//---------------------------------------对象转换
// FromA fromA = new FromA();
// fromA.setDate(new Date());
// fromA.setId(5L);
// fromA.setName("Aaaa");
//
// FromB fromB = mapper.map(fromA, FromB.class);
// System.out.println(fromB);FromB fromB = new FromB();
fromB.setDate(new Date());
fromB.setId(5L);
fromB.setValue("Aaaa");
FromA fromA = mapper.map(fromB, FromA.class);
System.out.println(fromA);
//---------------------------------------列表转换
// List<FromA> listA = new ArrayList<FromA>();
// listA.add(fromA);
//
// List<FromB> listB = (List)listA.stream()
// .map(objectA -> mapper.map(objectA, FromB.class))
// .collect(Collectors.toList());
//
// System.out.println(listB);List<FromB> listB = new ArrayList<FromB>();
listB.add(fromB);
List<FromA> listA = (List)listB.stream()
.map(objectB -> mapper.map(objectB, FromA.class))
.collect(Collectors.toList());//通过JAVA8流的方式,实现FromA和FromB集合之间的转换。
System.out.println(listA);
}
当需要对内部嵌套元素进行映射时,可以在的一方添加Mapping注解,代码如下:
FromA包含FromC,字段名称为private FromC fromC;
FromB的value字段与FromA内FromC的theName字段相对应,Mapping注解如下:
@Mapping("fromC.theName")
private String value;
注意:通过Hibernate级联获得的级联对象,虽然可以获取到数据,但通过此方法,是无法映射成功的。具体原因与解决方法,还未找到。
FromA定义如下:
public class FromA
{
private long id;
private String name;
private Date date;
private FromC fromC;
@Override
public String toString()
{
return "FromA [id=" + id + ", name=" + name + ", date=" + date + "]";
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
public FromC getFromC()
{
return fromC;
}
public void setFromC(FromC fromC)
{
this.fromC = fromC;
}
}
FromB定义如下:
public class FromB
{
private long id;
@Mapping("fromC.theName")
private String value;
private Date date;
@Override
public String toString()
{
return "FromB [id=" + id + ", value=" + value + ", date=" + date + "]";
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
}
FromC定义如下:
public class FromC
{
private String theName;public FromC()
{
super();
}public FromC(String theName)
{
super();
this.theName = theName;
}public String getTheName()
{
return theName;
}public void setTheName(String theName)
{
this.theName = theName;
}
}