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

Ray*_*Ray 9 java spring mapstruct

我想将MapStruct映射器与Spring的Conversion模型结合起来。因此,我将每个Mapper接口声明为Spring的扩展Converter

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

然后,我可以通过注入standard来使用mapper bean ConversionService

class CarWarehouse {
    @Autowired
    private ConversionService conversionService;

    ...

    public CarDto getCarInformation(Car car) {
        return conversionService.convert(car, CarDto.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但是我想知道是否有一种方法可以避免通过uses属性直接将一些Mappers注入到其他对象中。我想要做的是告诉映射到useConversionService雇用其他制图。但是,由于ConversionServiceconvert方法与MapStruct的映射方法的标准模式不匹配,因此代码生成插件无法识别在寻找子映射时可以使用该服务。基本上,我想写的是

@Mapper(uses=ConversionService.class)
public interface ParentMapper extends Converter<Parent, ParentDto>
Run Code Online (Sandbox Code Playgroud)

代替

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

有没有办法做到这一点?

编辑

既然有人问过了,可以说我有一个CarMapper上面的定义,它的类型CarCarDto属性分别wheel是type WheelWheelDto。然后,我希望能够像这样定义另一个Mapper:

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

现在,我必须显式添加此Mapper:

@Mapper(uses = WheelMapper.class)
public interface CarMapper extends Converter<Car, CarDto>
Run Code Online (Sandbox Code Playgroud)

然后将为生成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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ray*_*Ray 12

我问这个问题已经一年多了,但现在我们已经在 MapStruct 项目本身——MapStruct Spring Extensions项目中找到了答案。

CarMapper例子被提供作为项目内的示例。

  • 这个堆栈溢出答案将通过使用解决OP的特定问题的内联代码示例得到改进。我现在没有时间尝试它并测试它以确保它有效,并且我不想在没有确保它很好的情况下发布它。 (2认同)