2

我正在使用 Orika 1.4.5,我想让我的 BidirectionalConverter 进行映射 PaginatedResponse<T> to PaginatedResponse<S> ,反之亦然。

PaginatedResponse 类如下:

public class PaginatedResponse<T> {

    private List<T> items;
    private List<Sorting> orderBy;
    private PagingResponse paging;

    public PaginatedResponse(List<T> items, List<Sorting> orderBy, PagingResponse paging) {
        this.items = items;
        this.orderBy = orderBy;
        this.paging = paging;
    }

    // Getters
}

所以我希望我的 PaginatedResponseCovnerter 接受转换所在的所有地图调用PaginatedResponse<Something> object1 to PaginatedResponse<OtherSomething> object2,并且我希望 object1 和 object2 具有相同的 orderBy 和 paging 属性。所以我尝试这样做:

public class PaginatedResponseConverter<T, S>
    extends BidirectionalConverter<PaginatedResponse<T>, PaginatedResponse<S>>
    implements MapperAware {

    private MapperFacade mapper;
    private T clazz1;
    private S clazz2;

    public PaginatedResponseConverter(T clazz1, S clazz2) {
        this.clazz1 = clazz1;
        this.clazz2 = clazz2;
    }

    @Override
    public void setMapper(Mapper mapper) {
        this.mapper = (MapperFacade) mapper;
    }


    @Override
    @SuppressWarnings("unchecked")
    public PaginatedResponse<S> convertTo(PaginatedResponse<T> source, Type<PaginatedResponse<S>> destinationType) {
        System.out.println("ConverTo");
        PagingResponse paging = source.getPaging();
        List<Sorting> sortings = source.getOrderBy();
        List<S> items = (List<S>) this.mapper.mapAsList(source.getItems(), this.clazz2.getClass());
        return new PaginatedResponse<S>(items, sortings, paging);
    }


    @Override
    @SuppressWarnings("unchecked")
    public PaginatedResponse<T> convertFrom(PaginatedResponse<S> source, Type<PaginatedResponse<T>> destinationType) {
        // The same upside down
    }
}

但问题是我必须用泛型参数注册这个自定义转换器,而这些并不总是相同的。我希望如果我尝试转换 fromPaginatedResponse<SomeClass1> to PaginatedResponse<SomeClass2>是一样的,PaginatedResponse<AnotherClass1> to PaginatedResponse<AnotherClass2>顺便说一句,我不能这样做:

converterFactory.registerConverter(new PaginatedResponseConverter<Object, Object>(Object.class, Object.class));

因为通过这种方式,所有 PaginatedResponse 调用都会进入 PaginatedResponseConverter 但我不知道类的真实类型,所以当它进入 converTo 或 convertFrom 方法时,需要通用参数的确切类来执行 mapAsList() 方法

你能帮我解决这个问题吗?

4

1 回答 1

0

有一个基于 Orika 的解决方案TypeBuilder,它创建Type了存储其类型参数的 -s。

我的代码将 a 映射PaginatedResponse<Source>到 aPaginatedResponse<Dest1>然后映射到 a PaginatedResponse<Dest2>。如果你不介意一些通用警告,这里是:

驱动类:

public static void main(String[] args) {
    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    ConverterFactory converterFactory = mapperFactory.getConverterFactory();
    converterFactory.registerConverter(new PaginatedToPaginatedConverter());

    PaginatedResponse<Source> sourcePaginatedResponse = createSourceObject();
    MapperFacade mapper = mapperFactory.getMapperFacade();

    PaginatedResponse dest1PaginatedResponse = mapper.map(sourcePaginatedResponse,
            new TypeBuilder<PaginatedResponse<Source>>(){}.build(),
            new TypeBuilder<PaginatedResponse<Dest1>>(){}.build());

    PaginatedResponse dest2PaginatedResponse = mapper.map(sourcePaginatedResponse,
            new TypeBuilder<PaginatedResponse<Source>>(){}.build(),
            new TypeBuilder<PaginatedResponse<Dest2>>(){}.build());
}

转换器,请注意我没有费心泛化PaginatedResponse,而是覆盖了canConvert

public class PaginatedToPaginatedConverter extends BidirectionalConverter<PaginatedResponse, PaginatedResponse> {

    public PaginatedResponse convertTo(PaginatedResponse paginatedResponse, Type<PaginatedResponse> destinationType) {
        PaginatedResponse dest = new PaginatedResponse();
        dest.setItems(mapperFacade.mapAsList(paginatedResponse.getItems(),
                ((Type) destinationType.getActualTypeArguments()[0]).getRawType()));
        dest.setOrderBy(mapperFacade.mapAsList(paginatedResponse.getOrderBy(), Sorting.class));
        dest.setPaging(mapperFacade.map(paginatedResponse.getPaging(), PagingResponse.class));
        return dest;
    }

    public PaginatedResponse convertFrom(PaginatedResponse paginatedResponse, Type<PaginatedResponse> destinationType) {
        return null;
    }

    @Override
    public boolean canConvert(Type<?> sourceType, Type<?> destinationType) {
        return sourceType.getRawType().equals(PaginatedResponse.class)
                && destinationType.getRawType().equals(PaginatedResponse.class);
    }
}
于 2019-09-19T20:51:16.790 回答