如何解决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 而不是直接调用存储库,但要尽可能简单。 :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。