• 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;
            }
        }
    }
    
    总结:
    

     

  • 相关阅读:
    .Net Core主机配置
    .NET Core 初识
    控制反转IOC,依赖注入DI理解
    依赖倒置原则解析,理解面向抽象编程
    工厂模式
    IOC 概念
    利用Comparator排序
    使用Integer类实现二叉树排序
    先按成绩由高到低,相等则按年龄由低到高
    对象销毁之前进行某些操作
  • 原文地址:https://www.cnblogs.com/wangbiaohistory/p/15843496.html
Copyright © 2020-2023  润新知