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:
- 定义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); } }
- 修改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
相关产品推荐
相关产品推荐

