Mapstruct 自定义转换器

时间:2025-04-11 07:31:04

MapStruct 只提供了隐式类型转换和默认的一些转换,假如需要特定的类型转换,如将 日期转换为只保留年月日的字符串等,可以自定义转换规则

方式一:使用 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(.(()))")
    @Mapping(target = "updateTime", expression = "java(.(()))")
    public UserVO user2UserVO(User user);
}

注意:expression的属性值为需要写 全类名.方法名(参数)

方式二:使用 @Named 注解

  • 1、创建一个转换规则类,在对应的转换方法上标注 @Named 注解表示转换方法名
public class Timestamp2String {
    @Named("trans")
    public static String trans(Timestamp date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.format(date);
    }
}
  • 2、在映射器上使用 @Mapper 的 uses 属性,属性值为转换规则类的 Class 对象,然后再映射器对应的方法上使用 @Mapping 注解的 qualifiedByName 属性,属性值为转换规则类 @Named 定义的方法名
@Mapper( uses = Timestamp2String.class) 
public interface UserConverter{
    UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
    
    @Mapping(target = "createTime", source = "createTime", qualifiedByName = "trans")
    @Mapping(target = "updateTime", source = "updateTime", qualifiedByName = "trans")
    public UserVO user2UserVO(User user);
}