gpt4 book ai didi

java - MapStruct Mapper 作为 Spring Framework Converter - 可以惯用使用吗?

转载 作者:行者123 更新时间:2023-12-02 00:04:08 26 4
gpt4 key购买 nike

我想合并MapStruct使用 Spring 的映射器 Conversion model 。所以我声明每个 Mapper接口(interface)作为 Spring 的扩展 Converter :

@Mapper
public interface CarMapper extends Converter<Car, CarDto> {
@Override
CarDto convert(Car car);
}

然后我可以通过注入(inject)标准 ConversionService 来使用映射器 bean :

class CarWarehouse {
@Autowired
private ConversionService conversionService;

...

public CarDto getCarInformation(Car car) {
return conversionService.convert(car, CarDto.class);
}
}

这工作得很好,但我想知道是否有一种方法可以避免通过uses直接将一些映射器注入(inject)到其他映射器中属性。我想做的是告诉映射器 use ConversionService雇用另一个映射器。然而,自从ConversionServiceconvert方法与 MapStruct 的映射方法的标准模式不匹配,代码生成插件在查找子映射时无法识别它可以使用该服务。基本上,我想做的是写

@Mapper(uses=ConversionService.class)
public interface ParentMapper extends Converter<Parent, ParentDto>

而不是

@Mapper(uses={ChildMapper1.class, ChildMapper2.class, ChildMapper3.class})
public interface ParentMapper extends Converter<Parent, ParentDto>

有办法实现吗?

编辑

既然有人问了,假设我有一个 CarMapper定义如上,类型为CarCarDto具有属性 wheel类型 WheelWheelDto , 分别。然后我希望能够像这样定义另一个映射器:

@Mapper
public interface WheelMapper extends Converter<Wheel, WheelDto> {
@Override
WheelDto convert(Wheel wheel);
}

现在,我必须显式添加此映射器:

@Mapper(uses = WheelMapper.class)
public interface CarMapper extends Converter<Car, CarDto>

这将给出生成的 CarMapperImpl一个@Autowired类型 WheelMapper 的成员为了映射属性 wheel 将调用它.

但是,我希望生成的代码看起来有点像这样:

@Component
public class CarMapperImpl implements CarMapper {
@Autowired
private ConversionService conversionService;
@Override
public CarDto convert(Car car) {
CarDto carDto = new CarDto();
carDto.setWheel(conversionService.convert(car.getWheel(), WheelDto.class);
return carDto;
}
}

最佳答案

自从我提出这个问题以来已经一年多了,但现在我们已经在 MapStruct 项目本身中找到了答案 - MapStruct Spring Extensions项目。

一个CarMapper example作为项目中的示例提供。

关于java - MapStruct Mapper 作为 Spring Framework Converter - 可以惯用使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58081224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com