2017-02-01 13 views
0

У меня есть некоторые проблемы с MapStruct с использованием абстрактного класса. У меня 2 картографов:MapStruct: проблема с абстрактным классом

MapperA extends AbstractMapper<U,V> 
MapperB extends AbstractMapper<U,V> 

маппера использует MapperB

У меня есть метод в AbstractMapper

public <T extends AbstractReference> T resolveReference(String id, @TargetType Class<T> entityClass) { 
    // Some implementation 
} 

Хотя чистая установка, я получил неоднозначную ошибку метода.

Кажется, что Mapstruct находит метод дважды, по одному от каждого Mapper, который расширяет один и тот же класс.

Я сделал несколько поисков по предмету классификатора, но он кажется полезным при использовании разных методов с одной и той же сигнатурой. Но в моем случае это то же самое!

Если у вас есть какие-либо функции.

Благодаря

Edit:

@Mapper(componentModel = "cdi", uses = {MapperB.class}) 
    @ApplicationScoped 
    public abstract class MapperA extends AbstractMapper<U1,V1> {} 

MapperB не использует какой-либо другой картографа.

@Mapper(componentModel = "cdi") 
    @ApplicationScoped 
    public abstract class MapperB extends AbstractMapper<U2,V2> {} 
+0

Можете ли вы показать использовать картографа определения? Возможно, вы используете «MapperA» в «MapperB» или наоборот? – Filip

+0

@Mapper (componentModel = "cdi", uses = {MapperB.class}) @ApplicationScoped Публичный абстрактный класс MapperA расширяет AbstractMapper {} MapperB не использует никакой другой mapper. – teyma

+0

Почему у вас есть те параметры типа, которые были указаны на ваших карточках? Где они используются? – Gunnar

ответ

1

У вас на самом деле нет одного метода, у вас есть 2 метода. Один в MapperA и еще один в MapperB. MapStruct не заботится о наследовании и где находится каждый метод.

Кроме того, ваш метод

public <T extends AbstractReference> T resolveReference(String id, @TargetType Class<T> entityClass) { 
    // Some implementation 
} 

является родовым тот, который имеет тот же стирание и не зависит от общих параметров AbstractMapper, что приводит к неоднозначным погрешности метода по MapStruct.

Я не уверен, что вы на самом деле делаете в методе. Но если это что-то общее, которое не зависит от общих параметров AbstractMapperU и V, то я предлагаю вам извлечь этот метод в другой класс и добавить этот класс в переменную аннотации uses.

Если метод зависит от параметров, то убедитесь, что они являются частью его, то MapStruct будет работать правильно, так как они будут иметь другой тип во время компиляции (U1, V1 или U2, V2)

+0

Я думаю, что вы пишете, я должен использовать другой класс с аннотацией использования (Давайте назовем его MapperUtil). Но проблема останется прежней, если MapperA и MapperB используют класс MapperUtil, метод все равно будет отображаться дважды. – teyma

+0

Нет, если вы используете класс MapperUtill, MapStruct будет знать, что он исходит из одного класса, и это не должно быть проблемой. См. Комментарий от @gunnar по вашему вопросу.Если вы используете типы в 'resolReference', то он также должен работать. – Filip

+0

Спасибо за ответ, он работает с классом MapperUtil :) – teyma

 Смежные вопросы

  • Нет связанных вопросов^_^