Mapstruct 返回类型

问题描述 投票:0回答:2

没有为返回类型org.springframework.data.domain.Page注册实现类型。

@Mapper(componentModel = "spring", uses = { OptionalMapper.class, VehicleImageMapper.class, GearShiftMapper.class,
    FuelMapper.class, ColorMapper.class, ModelMapper.class, UserMapper.class })
public interface VehicleMapper {

    VehicleMapper INSTANCE = Mappers.getMapper(VehicleMapper.class);

    VehicleDTO vehicletoVehicleDTO(Vehicle vehicle);

    Page<VehicleDTO> vehicletoVehicleDTO(Page<Vehicle> vehicles);

    Iterable<VehicleDTO> vehicletoVehicleDTO(Iterable<Vehicle> vehicles);

    Vehicle vehicleDTOtoVehicle(VehicleDTO vehicleDTO);
}

我的服务...

@Override
public Page<VehicleDTO> searchVehiclesByPage(Pageable page) {
    Page<VehicleDTO> vehicles = vehicleMapper.vehicletoPageVehicleDTO(vehicleRepository.findAllByEnabled(page));
    return vehicles;
}

有人可以帮助我吗?

spring-boot mapstruct
2个回答
2
投票

这是 MapStruct 中的一个已知问题。看看 mapstruct#607

有一个解决方法(我认为是由于错误😄)。仅在第一个源参数和结果类型之间进行检查。不过,您将需要一个包装类型,以便能够使用

@Mapping
和多个参数。这意味着以下内容将起作用:

public class Wrapper<T> {
    private T value;
    //getters and setters
}

public interface MyMapper {

    @Mapping(source = "customers", target = "value")
    Wrapper<PageDTO<VehicleDTO>> map(Integer dummy, Page<Vehicle> vehicles);

}

将在 Integer 和 Wrapper 之间进行检查并允许。为了不暴露假人,你可以这样做:

public abstract class MyMapper {

    public PageDTO<VehicleDTO> map(Page<Vehicle> vehicles) {
        return map(1, vehicles).getValue(); //Maybe do null checks as well
    }

    @Mapping(source = "customers", target = "value")
    protected Wrapper<PageDTO<VehicleDTO>> map(Integer dummy, Page<Vehicle> vehicles);

}

这又是一个让 MapStruct 工作的解决方法,它不是一个功能。请关注链接的问题以了解官方支持何时到来。


0
投票
@Mapper
public interface VehicleMapper {
  VehicleDTO map(Vehicle data);

  default Page<VehicleDTO> map(Page<Vehicle> data) {
    return data.map(this::map);
  }
}

也许是这样的?

© www.soinside.com 2019 - 2024. All rights reserved.