eclipse使用mapstruct_MapStruct使用学习

MapStruct通过一些接口定义,能自动生成实现类,将一个类转换为另一个类。

引用

1.3.1.Final

...

org.mapstruct

mapstruct

${org.mapstruct.version}

...

org.apache.maven.plugins

maven-compiler-plugin

3.5.1

1.8

1.8

org.mapstruct

mapstruct-processor

${org.mapstruct.version}

这个依赖有两个问题

不支持lombok的@Data等注解

如果接口引用的类通过@Data标记,由于标记生成getter/setter等方法,但是在生成mapstruct mapper类时看不到,会导致编译找不到属性的问题。

解决方法:引入mapstruct-processor,同时去掉plugin中的annotationProcessorPaths:

...

org.mapstruct

mapstruct-processor

1.3.1.Final

provided

...

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

...

Spring中无法通过@Autowired注入接口

这是因为生成的Mapper实现类,没有被标注@Component,通过添加maven编译参数defaultComponentModel可以解决:

...

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

-Amapstruct.defaultComponentModel=spring

...

修改以后,我在eclipse中没有自动重新编译,需要clean再重新编译才生效。

引用Mapper

INSTANCE方式

接口中定义一个单例,其他地方引用,官方讲的比较清楚:

@Mapper

public interface CarMapper {

CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );

CarDto carToCarDto(Car car);

}

//引用Mapper

Car car = ...;

CarDto dto = CarMapper.INSTANCE.carToCarDto( car );

通过@Autowired依赖注入

需要前面配置的defaultComponentModel=spring,才能在代码中注入:

@Autowired

CarMapper carMapper;

其实上面的配置时全局的,也可以在mapper定义中,增加标记:

@Mapper(componentModel = "spring")

public interface CarMapper {

CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );

CarDto carToCarDto(Car car);

}

这样也行,只不过需要一个一个的Mapper都添加,不是那么方便了。

使用

可以转换复杂的结构类型,默认是同名的属性进行转换的。

按照官方文档的说明,生成的Mapper代码也是尽量符合手写代码,通过getter/setter设置,没有使用反射,这也是为什么通过lombok添加getter/setter会生成不成功的原因。

也支持通过注解,将不同名字的类型进行自动转换。

我实验的代码:

//源类型

@Data

public class TbUserCustomDO {

private List users;

private String fieldA;

private String field2;

}

//TbUser也是一个自定义类

@Data

public class TbUser implements Serializable {

private Integer id;

private String username;

private String password;

private String name;

private Integer age;

private Integer sex;

private Date birthday;

private Date created;

private Date updated

}

//目的类

@Data

public class TbUserDemoDTO {

private List users;

private String field1;

private String field2;

}

//这里TbUserDTO与源类中的TbUser不完全相同(少一些字段),但是注意每个已有字段名称是相同的

public class TbUserDTO {

private Integer id;

private String username;

private String password;

private String name;

private Integer age;

private Integer sex;

private Date birthday;

}

//Mapper类

@Mapper

public interface TbUserCustomConverter {

//这里把fieldA对应到field1,因为名称不同

@Mapping(source = "fieldA", target = "field1")

TbUserDemoDTO doToDTO(TbUserCustomDO cDo);

}

//注入Mapper

@Autowired

TbUserCustomConverter tbUserCustomConverter;

...

//使用,这里List和属性都能成功转换

TbUserCustomDO cDo = ...

TbUserDemoDTO dto = tbUserCustomConverter.doToDTO(cDo);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值