【问题标题】:Generic Mapper function in MapStructMapStruct 中的通用 Mapper 函数
【发布时间】:2020-12-20 02:07:52
【问题描述】:

朋友们,

这是我的 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 和谷歌gson 中都非常方便。感谢您的帮助!

【问题讨论】:

    标签: java gson mapstruct modelmapper object-object-mapping


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果我理解正确的话,你需要一种 repo。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 2019-12-04
        相关资源
        最近更新 更多