You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MapStruct映射时如何通过静态方法构建不可变类型Range<Long>?

问题场景代码

class RangeDTO {
  public org.apache.commons.lang3.Range<Long> range;
}

class SourceDTO {
  public Long min;
  public Long max;
}

public interface Mapper {
    @Mapping(target = "range.max", source = "max")
    @Mapping(target = "range.min", source = "min")
    public abstract RangeDTO map(SourceDTO source);
}

上述映射方法会抛出Range<Long> does not have an accessible constructor error错误——这是正常现象,因为Range没有可访问的构造方法,必须通过静态方法Range#between()创建。

需求:不使用expression注解,也不想编写单独的Range<Long> map(SourceDTO)方法,求解决方案。


解决方案

可以用MapStruct的@Factory注解定义Range实例的创建逻辑,无需额外映射方法或expression:

  1. 定义Range工厂类,提供实例创建的静态方法:
import org.apache.commons.lang3.Range;
import org.mapstruct.factory;

public class RangeFactory {
    @Factory
    public Range<Long> createRange(Long min, Long max) {
        return Range.between(min, max);
    }
}
  1. 修改Mapper接口,引入该工厂类:
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring", uses = RangeFactory.class) // 组件模型可根据实际需求调整,比如"default"
public interface Mapper {
    RangeDTO map(SourceDTO source);
}

MapStruct会自动扫描uses指定类中的@Factory方法,当需要创建Range类型对象时,会自动匹配参数(将SourceDTO的min和max传入createRange方法),生成实例后赋值给RangeDTO的range属性,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Luca Basso Ricci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:02:23