mapstruct进阶《三》

对应策略:
//    MappingConstants.ANY_REMAINING:只能用在source上,标识source中除了同名自动映射和指定映射外,其余所有对象都映射到target对象上。
//
//    MappingConstants.ANY_UNMAPPED:(会将source除指定对象(不包括同名自动映射)的剩余对象映射到target对象。)只能用在source上,不能和MappingConstants.ANY_REMAINING同时使用,
//
//    MappingConstants.NULL:设置在source上表示source是null时,会被映射到指定的target;设置在target上表示source对象映射到null。

 

下面展示下最恶心的枚举映射:

 

public enum LevelEnum {
    PERFECT(1, "完美"),
    PASS(2, "合格"),
    NORMAL(3, "普通"),
    FAILED(4, "不及格");

    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    private String desc;

    LevelEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

 

package com.mybatis.test.cache.po.customer.dto;

public enum DisableStatus {
    ABLE(1, "完美"),
    DISABLE(2, "合格"),
    NORMAL(3, "普通"),
    FAILED(4, "不及格"),
    OK(5, "还行"),
    FINE(6, "可以");
    private Integer code;

    private String desc;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    DisableStatus(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

 

@Mapper
public interface OrderCopier {
    @ValueMappings({
            @ValueMapping(source = "ABLE", target = "PERFECT"),
            @ValueMapping(source = MappingConstants.NULL, target = "PASS"),
            @ValueMapping(source = "FAILED", target = MappingConstants.NULL),
            @ValueMapping(source = MappingConstants.ANY_REMAINING, target = "NORMAL"),
    })

    LevelEnum toEnum(DisableStatus disableStatus);
}

 

package com.mybatis.test.cache.po.customer.coper;

import com.mybatis.test.cache.po.customer.dto.DisableStatus;
import com.mybatis.test.cache.po.customer.dto.LevelEnum;
import javax.annotation.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-01-26T15:46:55+0800",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_91 (Oracle Corporation)"
)
public class OrderCopierImpl implements OrderCopier {

    @Override
    public LevelEnum toEnum(DisableStatus disableStatus) {
        if ( disableStatus == null ) {
            return LevelEnum.PASS;//根据策略 MappingConstants.NULL:设置在source上表示source是null时,会被映射到指定的target;设置在target上表示source对象映射到null。
        }

        LevelEnum levelEnum;

        switch ( disableStatus ) {
            case ABLE: levelEnum = LevelEnum.PERFECT;//根据制定对应
            break;
            case FAILED: levelEnum = null;// MappingConstants.NULL:设置在source上表示source是null时,会被映射到指定的target;设置在target上表示source对象映射到null。
            break;
            case NORMAL: levelEnum = LevelEnum.NORMAL;
            break;
            default: levelEnum = LevelEnum.NORMAL;// MappingConstants.ANY_REMAINING:只能用在source上,标识source中除了同名自动映射和指定映射外,其余所有对象都映射到target对象上。
        }

        return levelEnum;
    }
}

 

还是上面的例子:这种策略时
  @ValueMapping(source = MappingConstants.ANY_UNMAPPED, target = "NORMAL")

 

public class OrderCopierImpl implements OrderCopier {

    @Override
    public LevelEnum toEnum(DisableStatus disableStatus) {
        if ( disableStatus == null ) {
            return null;
        }

        LevelEnum levelEnum;

        switch ( disableStatus ) {
            default: levelEnum = LevelEnum.NORMAL;//除指定的其余都设置成NORMAL
        }

        return levelEnum;
    }
}

 

结尾送大家个,输入的枚举转换技巧,当然了所有的便利都是建立在最开始的约定上,要是团队里五花八门就只能恶心的进行set,get了

 

    //@EnumMapping#nameTransformationStrategy支持的参数有:suffix(添加源后缀)、stripSuffix(删除源后缀)、prefix(添加源前缀)、stripPrefix(删除源前缀)。
    @EnumMapping(nameTransformationStrategy = "stripSuffix", configuration = "_STATUS")
    LevelEnum toEnum(DisableStatus disableStatus);

 

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-01-26T18:03:32+0800",
    comments = "version: 1.4.2.Final, compiler: javac, environment: Java 1.8.0_91 (Oracle Corporation)"
)
public class OrderCopierImpl implements OrderCopier {

    @Override
    public LevelEnum toEnum(DisableStatus disableStatus) {
        if ( disableStatus == null ) {
            return null;
        }

        LevelEnum levelEnum;

        switch ( disableStatus ) {
            case ABLE_STATUS: levelEnum = LevelEnum.ABLE;
            break;
            case DISABLE_STATUS: levelEnum = LevelEnum.DISABLE;
            break;
            case NORMAL_STATUS: levelEnum = LevelEnum.NORMAL;
            break;
            case FAILED_STATUS: levelEnum = LevelEnum.FAILED;
            break;
            case OK_STATUS: levelEnum = LevelEnum.OK;
            break;
            case FINE_STATUS: levelEnum = LevelEnum.FINE;
            break;
            default: throw new IllegalArgumentException( "Unexpected enum constant: " + disableStatus );
        }

        return levelEnum;
    }
}

 

posted @ 2022-01-25 22:18  余生请多指教ANT  阅读(109)  评论(0编辑  收藏  举报