目录
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(删除源前缀)。