对应策略:
// 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;
}
}