MapStruct使用

简介: 背景在一个成熟可维护的工程中,细分模块后,domian工程最好不要被其他工程依赖,但是实体类一般存于domain之中,这样其他工程想获取实体类数据时就需要在各自工程写model,自定义model可以根据自身业务需要而并不需要映射整个实体属性。

背景

在一个成熟可维护的工程中,细分模块后,domian工程最好不要被其他工程依赖,但是实体类一般存于domain之中,这样其他工程想获取实体类数据时就需要在各自工程写model,自定义model可以根据自身业务需要而并不需要映射整个实体属性。
mapstruct这个插件就是用来处理domin实体类与model类的属性映射,定义mapper接口,mapstruct就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现。

如何使用?

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>
 * 基础转换类,提供基本的几个方法,直接继承就可以,如果有需要写Mappings的写在 {@link #to(Object)} 方法上
 * 并且接口类上一定要加上 {@link org.mapstruct.Mapper} 注解
 * 默认注解,需要单独定义 如 CategoryMapper MAPPER = Mappers.getMapper(CategoryMapper.class); 以此进行实例创建和调用
 * 或者如下
 *
 * @Mapper(componentModel = "spring") 此注解可通过spring进行注入。
 */
public interface BasicObjectMapper<SOURCE, TARGET> {
    /**
     * 如有需要自定义该注解即可
     * 例如:
     *
     * @Mappings({
     * @Mapping(source = "code", target = "categoryCode"),
     * @Mapping(source = "name", target = "categoryName")
     * })
     * <p></p>
     * 重写此注解时一定要注意 返回值(TARGET) 和 参数(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

开发中如需要对象转换操作可直接新建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 SongJian 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);
    }

文章参考:

https://blog.csdn.net/jtf8525140/article/details/78130601

https://www.tuicool.com/articles/uiIRjai

相关文章
|
安全 IDE Java
MapStruct - 原理讲解
MapStruct - 原理讲解
1283 2
MapStruct - 原理讲解
MapStruct - 生成空对象解决方案
MapStruct - 生成空对象解决方案
1559 0
|
7月前
|
安全 IDE Java
使用MapStruct和Lombok简化代码
使用MapStruct和Lombok简化代码
204 2
|
6月前
|
Java
@SneakyThrows 是 Lombok 库中的一个注解
`@SneakyThrows` 是 Lombok 库中的一个注解,它可以让你在方法签名中省略异常声明,而不需要显式地使用 try-catch 块来处理这些异常。当你使用 `@SneakyThrows` 注解时,Lombok 会自动生成相应的 try-catch 代码,将异常封装成运行时异常(通常是 `RuntimeException` 或其子类)。 这个注解在某些情况下可以简化代码,但请注意,它可能会隐藏潜在的问题,因为异常被转换成了运行时异常,这可能导致调用者无法正确处理这些异常。 下面是一个使用 `@SneakyThrows` 的示例: ```java import lombok.S
457 0
|
7月前
|
存储 JSON Java
mapstruct最佳实践
当两个对象属性不一致时,比如User对象中某个字段不存在与UserVo当中时,在编译时会有警告提示,可以在@Mapping中配置 ignore = true,当字段较多时,可以直接在@Mapper中设置unmappedTargetPolicy属性或者unmappedSourcePolicy属性为 ReportingPolicy.IGNORE即可。 如果项目中也同时使用到了 Lombok,一定要注意 Lombok的版本要等于或者高于1.18.10,否则会有
118 0
|
8月前
|
Java
mapstruct模板
mapstruct模板
62 1
|
Java Spring 容器
mapstruct
mapstruct
69 0
lombok的Tolerate注解
lombok的Tolerate注解
122 0
|
Java Maven
Lombok常用注解
Lombok常用注解
72 0