MapStruct中的通用Mapper函数

问题描述

朋友

这是我的Java对象

@Data
public class CarDto {
    private String make;
    private String model;
    private int year; 
}

@Data
public class Car {
    private MakeEnum make;
    private String model;
    private int year;   
}

为了消费,我需要做这样的事情

@Mapper
public interface CarMapper {
   CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
   Car toModel(CarDto carDto);
   CarDto toDto(Car carModel);
}

// Using mapper
Car carModel = CarMapper.INSTANCE.toModel(carDto);

但是我正在寻找一种解决方案,在这里我可以做到:

  Car carModel = Mapper.map(carDto,Car.class);

该怎么做?没有找到可以基于Type动态映射的示例。我发现此方法在ModelMapper和Google gson中都很方便。感谢您的帮助!

解决方法

如果我对您的理解正确,则需要某种回购。

另一个选择是查看sprint和最近开发的新MapStruct弹簧集成:https://github.com/mapstruct/mapstruct-spring-extensions。它被设计为对此question的后续。

示例回购中有一个示例。但这并不简单:https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-mapper-repo

,

在调用映射之前,您必须像这样设置 MapStruct 和接口:

@Mapper(componentModel = "spring")
public interface MapStructMapper {

    ObjectDto objectToObjectDto(Object object);

}

然后是它的一个实现:

@Component
public class MapStructMapperImpl implements MapStructMapper {

    @Override
    public ObjectDto objectToObjectDto(Object object) {

        if ( object == null ) { return null; }

        ObjectDto objectDto = new ObjectDto();
        objectDto.setId( object.getId() );
        objectDto.setName( object.getName() );

        return objectDto;
    }

然后,你只需要在控制器中注入这个接口并像这样调用存储库:

@RequestMapping("/objects")
public class ObjectController {

    private MapStructMapper mapstructMapper;

    private ObjectRepository objectRepository;

    @Autowired
    public ObjectController(
            MapStructMapper mapstructMapper,ObjectRepository objectRepository
    ) {
        this.mapstructMapper = mapstructMapper;
        this.objectRepository = objectRepository;
    }

    @GetMapping("/{id}")
    public ResponseEntity<ObjectDto> getById(@PathVariable(value = "id") int id){
        return new ResponseEntity<>(
                mapstructMapper.objectToObjectDto(
                        objectRepository.findById(id).get()
                ),HttpStatus.OK
        );
    }
    
}

当然,您可以调用 service/serviceImpl 而不是直接调用存储库,但要尽可能简单。 :)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...