mapstruct进阶用法《一》
一.mapstruct除了能自动映射字段属性,也可以定义javaBean见得规则进行映射
/**
* 使用自定义的映射器BooleanStr
*/
@Mapper(uses ={BooleanStr.class})
public interface CustomerInterface {
CustomerInterface INSTANCE= Mappers.getMapper(CustomerInterface.class);
@Mappings({
@Mapping(source = "name", target = "customerName"),
@Mapping(source = "isDisable", target = "disable")
})
CustomerDto toCustomerDto(Customer customer);
@InheritInverseConfiguration//在一个组合里上面方法的配置可逆性映射
CustomerDto fromCustomer(Customer customer);
}
二.自定义映射规则BooleanStr 后,就可以把Customer的Boolean属性转换成目标bean的String类型
/**
* 自定义转换规则的类
*/
public class BooleanStr {
public String toStr(Boolean isDisable) {
if (isDisable) {
return "Y";
} else {
return "N";
}
}
public Boolean toBoolean(String str) {
if (str.equals("Y")) {
return true;
} else {
return false;
}
}
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2022-01-25T16:15:32+0800",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_91 (Oracle Corporation)"
)
public class CustomerInterfaceImpl implements CustomerInterface {
private final BooleanStr booleanStr = new BooleanStr();
@Override
public CustomerDto toCustomerDto(Customer customer) {
if ( customer == null ) {
return null;
}
CustomerDto customerDto = new CustomerDto();
customerDto.setDisable( booleanStr.toStr( customer.getIsDisable() ) );
customerDto.setCustomerName( customer.getName() );
customerDto.setId( customer.getId() );
return customerDto;
}
}
2.除了上面自定义规则外还可以把目标bean同过注入容器的方式来处理比如下面所示:
/**
* 这里主要是这个componentModel 属性,它的值就是当前要使用的依赖注入的环境
* 必须要引入spring的jar包
*/
@Mapper(componentModel = "spring")
public interface RefundInterface {
RefundInterface INSTANCE= Mappers.getMapper(RefundInterface.class);
@Mappings({
@Mapping(source = "shardKey",target = "key")
})
RefundVo refundTo(Refund refund);
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2022-01-25T16:15:32+0800",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_91 (Oracle Corporation)"
)
@Component
public class RefundInterfaceImpl implements RefundInterface {
@Override
public RefundVo refundTo(Refund refund) {
if ( refund == null ) {
return null;
}
RefundVo refundVo = new RefundVo();
refundVo.setKey( refund.getShardKey() );
return refundVo;
}
}
上述可以以组件的方式注入容器,在需要的地方进行AtuoWrite使用
三.除了一,二分别制定spring容器和自定义规则 另外,还可以把自定义规则以springbean的形式注入到映射目标的实现中去,实现“自动化”无感知的的便捷。
这里还是以上面的为例
/**
* 使用自定义的映射器BooleanStr
*/
@Mapper(uses ={BooleanStr.class},componentModel ="spring")
public interface CustomerInterface {
CustomerInterface INSTANCE= Mappers.getMapper(CustomerInterface.class);
@Mappings({
@Mapping(source = "name", target = "customerName"),
@Mapping(source = "isDisable", target = "disable")
})
CustomerDto toCustomerDto(Customer customer);
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2022-01-25T17:08:28+0800",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_91 (Oracle Corporation)"
)
@Component
public class CustomerInterfaceImpl implements CustomerInterface {
@Autowired
private BooleanStr booleanStr;
@Override
public CustomerDto toCustomerDto(Customer customer) {
if ( customer == null ) {
return null;
}
CustomerDto customerDto = new CustomerDto();
customerDto.setDisable( booleanStr.toStr( customer.getIsDisable() ) );
customerDto.setCustomerName( customer.getName() );
customerDto.setId( customer.getId() );
return customerDto;
}
}
/**
* 自定义转换规则的类
* 也可以根据业务自己实现去注入,原理一样的这里不再赘述
*/
@Component
public class BooleanStr {
public String toStr(Boolean isDisable) {
if (isDisable) {
return "Y";
} else {
return "N";
}
}
public Boolean toBoolean(String str) {
if (str.equals("Y")) {
return true;
} else {
return false;
}
}
}
总结:

本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/15843496.html

浙公网安备 33010602011771号