MapStruct文档(六)——枚举映射

目录

5.1、枚举和枚举映射

5.2、枚举和String映射

5.2.1、enum to String

 

5.2.2、String to enum

5.3、自定义名称转换


5.1、枚举和枚举映射

枚举通常是直接映射到同名的枚举对象中,不同名需@ValueMapping指定,并且源和目标上可以设置

MappingConstants.ANY_REMAINING:只能用在source上,标识source中除了同名自动映射和指定映射外,其余所有对象都映射到target对象上。

MappingConstants.ANY_UNMAPPED:只能用在source上,不能和MappingConstants.ANY_REMAINING同时使用,

MappingConstants.NULL:设置在source上表示source是null时,会被映射到指定的target;设置在target上表示source对象映射到null。


public enum LevelEnum {

    PERFECT(1, "完美"),
    PASS(2, "合格"),
    normal_status(3, "普通"),
    failed(4, "不及格"),
    normal(5, "正常");

    private Integer code;

    private String desc;

    LevelEnum(Integer code, String desc) {
        this.code = code;
        this.desc = 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;
    }
}
 
public enum DisableStatus {

    able_status(1, "完美"),
    disable_status(2, "合格"),
    normal_status(3, "普通"),
    failed_status(4, "不及格"),
    ok_status(5, "还行"),
    fine_status(6, "可以");

    private Integer code;

    private String desc;

    DisableStatus(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}
 
@Mapper
public interface TestMapper {

    @ValueMappings({
            @ValueMapping(source = "able_status", target = "PERFECT"),
            @ValueMapping(source = MappingConstants.NULL, target = "PASS"),
            @ValueMapping(source = "failed_status", target = MappingConstants.NULL),
            @ValueMapping(source = MappingConstants.ANY_REMAINING, target = "normal"),
    })
    LevelEnum toEnum(DisableStatus disableStatus);

}
 
@Component
public class TestMapperImpl implements TestMapper {

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

        LevelEnum levelEnum;

        switch ( disableStatus ) {
            case able_status: levelEnum = LevelEnum.PERFECT;
            break;
            case failed_status: levelEnum = null;
            break;
            case normal_status: levelEnum = LevelEnum.normal_status;
            break;
            default: levelEnum = LevelEnum.normal;
        }

        return levelEnum;
    }
}

MappingConstants.ANY_UNMAPPED会将source除指定对象(不包括同名自动映射)的剩余对象映射到target对象。


@Mapper
public interface TestMapper {

    @ValueMappings({
            @ValueMapping(source = MappingConstants.ANY_UNMAPPED, target = "normal_status"),
    })
    LevelEnum toEnum(DisableStatus disableStatus);

}
 
@Component
public class TestMapperImpl implements TestMapper {

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

        LevelEnum levelEnum;

        switch ( disableStatus ) {
            default: levelEnum = LevelEnum.normal_status;
        }

        return levelEnum;
    }
}

映射的方法是testBOS.getList().addAll( list )

 

但我们通常不需要修改这个策略属性,因为java的bean对象我们一般都会设置getter/setter方法,所以结果如下。


@Data
public class TestPOS {

    private List<TestPO> list;
}
 
@Data
public class TestBOS {

    private List<TestBO> list;
}
 
@Mapper
public interface TestMapper {

    TestBO toBO(TestPO testPO);

    TestBOS toBOS(TestPOS testPOS);

}
 
@Component
public class TestMapperImpl implements TestMapper {

    @Override
    public TestBO toBO(TestPO testPO) {
        if ( testPO == null ) {
            return null;
        }

        TestBO testBO = new TestBO();

        testBO.setId( testPO.getId() );
        testBO.setName( testPO.getName() );
        if ( testPO.getPrice() != null ) {
            testBO.setPrice( testPO.getPrice().toString() );
        }
        if ( testPO.getCreteTime() != null ) {
            testBO.setCreteTime( new SimpleDateFormat().format( testPO.getCreteTime() ) );
        }

        return testBO;
    }

    @Override
    public TestBOS toBOS(TestPOS testPOS) {
        if ( testPOS == null ) {
            return null;
        }

        TestBOS testBOS = new TestBOS();

        testBOS.setList( testPOListToTestBOList( testPOS.getList() ) );

        return testBOS;
    }

    protected List<TestBO> testPOListToTestBOList(List<TestPO> list) {
        if ( list == null ) {
            return null;
        }

        List<TestBO> list1 = new ArrayList<TestBO>( list.size() );
        for ( TestPO testPO : list ) {
            list1.add( toBO( testPO ) );
        }

        return list1;
    }
}

直接使用testBOS.setList( testPOListToTestBOList( testPOS.getList() ) )方法。


5.2、枚举和String映射

5.2.1、enum to String

不支持MappingConstants.ANY_REMAINING


@Mapper
public interface TestMapper {

    @ValueMappings({
            @ValueMapping(source = "able_status", target = "PERFECT"),
            @ValueMapping(source = MappingConstants.NULL, target = "PASS"),
            @ValueMapping(source = "failed_status", target = MappingConstants.NULL),
            @ValueMapping(source = MappingConstants.ANY_UNMAPPED, target = "normal"),
    })
    String toEnum(DisableStatus disableStatus);

}
 
@Component
public class TestMapperImpl implements TestMapper {

    @Override
    public String toEnum(DisableStatus disableStatus) {
        if ( disableStatus == null ) {
            return "PASS";
        }

        String string;

        switch ( disableStatus ) {
            case able_status: string = "PERFECT";
            break;
            case failed_status: string = null;
            break;
            default: string = "normal";
        }

        return string;
    }
}

 

5.2.2、String to enum


@Mapper
public interface TestMapper {

    @ValueMappings({
            @ValueMapping(source = "PERFECT", target = "able_status"),
            @ValueMapping(source = "PASS", target = MappingConstants.NULL),
            @ValueMapping(source = MappingConstants.NULL, target = "failed_status"),
            @ValueMapping(source = MappingConstants.ANY_UNMAPPED, target = "normal_status"),
    })
    DisableStatus toEnum(String disableStatus);

}
 
@Component
public class TestMapperImpl implements TestMapper {

    @Override
    public DisableStatus toEnum(String disableStatus) {
        if ( disableStatus == null ) {
            return DisableStatus.failed_status;
        }

        DisableStatus disableStatus1;

        switch ( disableStatus ) {
            case "PERFECT": disableStatus1 = DisableStatus.able_status;
            break;
            case "PASS": disableStatus1 = null;
            break;
            default: disableStatus1 = DisableStatus.normal_status;
        }

        return disableStatus1;
    }
}
 
@Mapper
public interface TestMapper {

    @ValueMappings({
            @ValueMapping(source = "PERFECT", target = "able_status"),
            @ValueMapping(source = "PASS", target = MappingConstants.NULL),
            @ValueMapping(source = MappingConstants.NULL, target = "failed_status"),
            @ValueMapping(source = MappingConstants.ANY_REMAINING, target = "normal_status"),
    })
    DisableStatus toEnum(String disableStatus);

}
 
@Component
public class TestMapperImpl implements TestMapper {

    @Override
    public DisableStatus toEnum(String disableStatus) {
        if ( disableStatus == null ) {
            return DisableStatus.failed_status;
        }

        DisableStatus disableStatus1;

        switch ( disableStatus ) {
            case "PERFECT": disableStatus1 = DisableStatus.able_status;
            break;
            case "PASS": disableStatus1 = null;
            break;
            case "able_status": disableStatus1 = DisableStatus.able_status;
            break;
            case "disable_status": disableStatus1 = DisableStatus.disable_status;
            break;
            case "normal_status": disableStatus1 = DisableStatus.normal_status;
            break;
            case "failed_status": disableStatus1 = DisableStatus.failed_status;
            break;
            case "ok_status": disableStatus1 = DisableStatus.ok_status;
            break;
            case "fine_status": disableStatus1 = DisableStatus.fine_status;
            break;
            default: disableStatus1 = DisableStatus.normal_status;
        }

        return disableStatus1;
    }
}

5.3、自定义名称转换

可以通过删除或添加源枚举字符串的前后缀来映射目标枚举对象。


public enum LevelEnum {

    able(1, "完美"),
    disable(2, "合格"),
    normal(3, "普通"),
    failed(4, "不及格"),
    ok(5, "还行"),
    fine(6, "可以");

    private Integer code;

    private String desc;

    LevelEnum(Integer code, String desc) {
        this.code = code;
        this.desc = 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;
    }
}
 
public enum DisableStatus {

    able_status(1, "完美"),
    disable_status(2, "合格"),
    normal_status(3, "普通"),
    failed_status(4, "不及格"),
    ok_status(5, "还行"),
    fine_status(6, "可以");

    private Integer code;

    private String desc;

    DisableStatus(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}
 
@Mapper
public interface TestMapper {

    @EnumMapping(nameTransformationStrategy = "stripSuffix", configuration = "_status")
    LevelEnum toEnum(DisableStatus disableStatus);

}
 
@Component
public class TestMapperImpl implements TestMapper {

    @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;
    }
}

@EnumMapping#nameTransformationStrategy支持的参数有:suffix(添加源后缀)、stripSuffix(删除源后缀)、prefix(添加源前缀)、stripPrefix(删除源前缀)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值