MapStruct 只提供了隐式类型转换和默认的一些转换,假如需要特定的类型转换,如将 java.sql.Timestamp 日期转换为只保留年月日的字符串等,可以自定义转换规则
方式一:使用 expression 表达式
1、创建一个转换规则类 public class Timestamp2String { public static String trans(Timestamp date) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); return simpleDateFormat.format(date); 2、在映射器对应的转换方法上使用 @Mapping 注解的 expression 属性标识转换规则 @Mapper public interface UserConverter{ UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
@Mapping(target = "createTime", expression = "java(com.hc.util.Timestamp2String.trans(user.getCreateTime()))")
@Mapping(target = "updateTime", expression = "java(com.hc.util.Timestamp2String.trans(user.getUpdateTime()))")
public UserVO user2UserVO(User user);
注意:expression的属性值为需要写 全类名.方法名(参数)
方式二:使用 @Named 注解
1、创建一个转换规则类,在对应的转换方法上标注 @Named 注解表示转换方法名
public class DateToLongConverter {
* 时间转long
* @param dateTime
* @return
@Named("dateToLong")
public Long jsonStringToObject(LocalDateTime dateTime) {
long milli = dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
return milli;
2、在映射器上使用 @Mapper 的 uses 属性,属性值为转换规则类的 Class 对象,然后再映射器对应的方法上使用 @Mapping 注解的 qualifiedByName 属性,属性值为转换规则类 @Named 定义的方法名
@Mapper(uses = DateToLongConverter.class)
public interface UpgradeStateConverter {
@Mapping(target = "createTime", source = "createTime", qualifiedByName = "dateToLong")
@Mapping(target = "updateTime", source = "updateTime", qualifiedByName = "dateToLong")
UpgradeDeviceStateDTO toUpgradeDeviceStateDTO( UpgradeStatePO upgradeStateInfo);
黑暗也有阳光
软件工程师