gson MapStruct中的通用Map器函数

xyhw6mcr  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(160)

朋友们,
这是我的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);

如何做到这一点?没有找到一个例子,我可以动态Map的基础上类型。我发现这个方法非常方便,在ModelMapper和谷歌gson。感谢您的帮助!

5tmbdcev

5tmbdcev1#

如果我没理解错的话,你需要一种回购协议。
另一个选择是查看sprint和最近开发的新MapStruct spring集成:https://github.com/mapstruct/mapstruct-spring-extensions。它是作为此question的后续设计的。
在示例repo中有一个例子,但并不简单:https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-mapper-repo

vx6bjr1n

vx6bjr1n2#

在调用Map之前,您必须像这样设置和连接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,而不是直接调用存储库,但它必须尽可能简单。:)

相关问题