0

朋友们,

这是我的 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);

如何做到这一点?没有找到可以基于类型动态映射的示例。ModelMapper我发现这种方法在& Google中都非常方便gson。感谢你的帮助!

4

2 回答 2

0

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

于 2021-06-20T21:10:34.767 回答
0

如果我理解正确,您需要一种回购。

另一种选择是查看 sprint 和最近开发的新 MapStruct spring 集成:https ://github.com/mapstruct/mapstruct-spring-extensions 。它被设计为这个问题的后续行动。

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

于 2020-09-05T10:33:18.227 回答