領域對象之間的轉換很常見,之前有幾次用BeanUtil在某些時候漏掉一些字段,而且也不夠靈活,所以就沒在用。
然后基本都是手寫convert類,但是多了就覺得很麻煩。。。
后來發現了mapstruct
maven依賴
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</dependency>
看一下如何使用吧:
首先寫兩個類A和B
@Data
public class A {
private String name;
private int age;
private Date date;
}
@Data
public class B {
private String username;
private int age;
private String date;
}
轉換類接口TestConverter,通過@Mapping注解可以比較靈活的定制自己想要的轉換方式
@Mapper
public interface TestConverter {
TestConverter INSTANCE = Mappers.getMapper(TestConverter.class);
@Mappings({
@Mapping(source="name", target="username"),
@Mapping(source="age", target="age"),
@Mapping(source="date", target="date",dateFormat="yyyy-MM-dd HH:mm:ss")
})
B convertA2B(A a);
}
然后重新構建maven項目
mvn clean compile
會自動生成一個TestConverter的實現類
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2019-10-10T16:55:44+0800",
comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)"
)
public class TestConverterImpl implements TestConverter {
@Override
public B convertA2B(A a) {
if ( a == null ) {
return null;
}
B convertB = new B();
if ( a.getDate() != null ) {
convertB.setDate( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( a.getDate() ) );
}
convertB.setAge( a.getAge() );
convertB.setUsername( a.getName() );
return convertB;
}
}
接下來就可以調用了
public static void main(String[] args) {
A a = new A();
a.setAge(13);
a.setName("luke");
a.setDate(new Date());
B b = TestConverter.INSTANCE.convertA2B(a);
System.out.println(JSON.toJSONString(b));
}
查看打印結果:
{"age":13,"date":"2019-10-10 17:00:32","username":"luke"}