我想将MapStruct
映射器与 Spring 的Conversion model结合起来。所以我将每个Mapper
接口声明为 Spring 的扩展Converter
:
@Mapper
public interface CarMapper extends Converter<Car, CarDto> {
@Override
CarDto convert(Car car);
}
然后我可以通过注入标准来使用映射器 bean ConversionService:
class CarWarehouse {
@Autowired
private ConversionService conversionService;
...
public CarDto getCarInformation(Car car) {
return conversionService.convert(car, CarDto.class);
}
}
这很好用,但我想知道是否有一种方法可以避免通过属性直接将一些映射器注入其他映射器uses。我想做的是告诉映射器use雇用ConversionService另一个映射器。但是,由于ConversionServicesconvert方法与 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如上所述的定义,其类型Car和分别具有类型和的CarDto属性。然后我希望能够像这样定义另一个映射器:wheelWheelWheelDto
@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;
}
}
忽然笑
森栏
冉冉说
相关分类