背景
在一個(gè)成熟可維護(hù)的工程中衷快,細(xì)分模塊后拷肌,domian工程最好不要被其他工程依賴馋袜,但是實(shí)體類一般存于domain之中,這樣其他工程想獲取實(shí)體類數(shù)據(jù)時(shí)就需要在各自工程寫model趁啸,自定義model可以根據(jù)自身業(yè)務(wù)需要而并不需要映射整個(gè)實(shí)體屬性强缘。
mapstruct這個(gè)插件就是用來處理domin實(shí)體類與model類的屬性映射,定義mapper接口莲绰,mapstruct就會自動的幫我們實(shí)現(xiàn)這個(gè)映射接口欺旧,避免了麻煩復(fù)雜的映射實(shí)現(xiàn)。
image.png
如何使用蛤签?
1辞友、簡單封裝
import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mappings;
import java.util.Collection;
import java.util.List;
/**
* @author jack cooper
* <p></p>
* 基礎(chǔ)轉(zhuǎn)換類,提供基本的幾個(gè)方法,直接繼承就可以称龙,如果有需要寫Mappings的寫在 {@link #to(Object)} 方法上
* 并且接口類上一定要加上 {@link org.mapstruct.Mapper} 注解
* 默認(rèn)注解留拾,需要單獨(dú)定義 如 CategoryMapper MAPPER = Mappers.getMapper(CategoryMapper.class); 以此進(jìn)行實(shí)例創(chuàng)建和調(diào)用
* 或者如下
*
* @Mapper(componentModel = "spring") 此注解可通過spring進(jìn)行注入。
*/
public interface BasicObjectMapper<SOURCE, TARGET> {
/**
* 如有需要自定義該注解即可
* 例如:
*
* @Mappings({
* @Mapping(source = "code", target = "categoryCode"),
* @Mapping(source = "name", target = "categoryName")
* })
* <p></p>
* 重寫此注解時(shí)一定要注意 返回值(TARGET) 和 參數(shù)(SOURCE) 的順序
*/
@Mappings({})
@InheritConfiguration
TARGET to(SOURCE source);
@InheritConfiguration
List<TARGET> to(Collection<SOURCE> source);
@InheritInverseConfiguration
SOURCE from(TARGET source);
@InheritInverseConfiguration
List<SOURCE> from(Collection<TARGET> source);
}
2鲫尊、自定義mapper
開發(fā)中如需要對象轉(zhuǎn)換操作可直接新建interface并繼承BasicObjectMapper<SOURCE,TARGET>痴柔,并在新建的接口上加上 @Mapper(componentModel = "spring"),
3疫向、字段不一致地方配置mapping
import com.ampmind.framework.api.base.BasicObjectMapper;
import com.ampmind.service.skumng.api.protocol.vo.CategoryVo;
import com.ampmind.service.skumng.domain.ProductCategory;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
/**
* Created by on 2017/3/30.
*
*/
@Mapper(componentModel = "spring")
public interface CategoryMapper extends BasicObjectMapper<CategoryVo, ProductCategory> {
@Mappings({
@Mapping(source = "code", target = "categoryCode"),
@Mapping(source = "name", target = "categoryName")
})
ProductCategory to(CategoryVo source);
}
文章參考: