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; } }
一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰