当前位置: 首页 > 知识库问答 >
问题:

MapStruct中的通用映射器函数

景哲
2023-03-14
@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、GoogleGSON中都非常方便。感谢你的帮助!

共有1个答案

子车鸿才
2023-03-14

在调用映射之前,您必须像下面这样设置和接口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
        );
    }
    
}
 类似资料:
  • 是否可能在MapStruct中使用不同的映射器?我有这个映射器 是否可以将此实现更改为MapStruct?

  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • 我正在使用Spring,并且在我的项目中从mapstruct库开始,所以我有了一个想法,为@mapper(componentModel=“Spring”)创建原型注释,比如@springmapper。但它不会生成任何映射器。 是不可能还是我做错了什么?

  • Hi这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:

  • 假设我需要将两个对象映射成一个或一个对象映射成一个(重载)。我可以通过以下映射来实现: 是否有一种方法可以更改第二个映射器“先做第一个映射器”,然后应用的附加映射?

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!