2017-02-01 4 views
0

Ich habe einige Probleme mit MapStruct mit abstrakten Klasse. Ich habe 2 Mapper:MapStruct: Problem mit der abstrakten Klasse

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

MapperA verwendet MapperB

ich eine Methode in AbstractMapper habe

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

Während saubere Installation, ich habe den zweideutigen Methodenfehler.

Es scheint, dass Mapsstruct die Methode zweimal findet, eine von jedem Mapper, der dieselbe Klasse erweitert.

Ich habe eine Suche nach der Qualifier-Sache gemacht, aber es scheint nützlich zu sein, wenn verschiedene Methoden mit der gleichen Signatur verwendet werden. Aber in meinem Fall ist es derselbe !!

Wenn Sie irgendwelche Ints haben.

Dank

Edit:

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

MapperB verwendet keine andere Mapper.

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

Können Sie Ihre Mapper verwenden zeigen Definitionen? Verwenden Sie MapperA in MapperB oder umgekehrt? – Filip

+0

@Mapper (componentModel = "cdi", verwendet = {MapperB.class}) @ApplicationScoped öffentliche abstrakte Klasse MapperA erweitert AbstractMapper {} MapperB verwendet keinen anderen Mapper. – teyma

+0

Warum haben Sie diese Typparameter auf Ihren Mappern deklariert? Wo werden sie benutzt? – Gunnar

Antwort

1

Sie haben eigentlich keine Methode, Sie haben 2 Methoden. Eine in MapperA und eine andere in MapperB. MapStruct interessiert sich nicht für die Vererbung und wo sich jede Methode befindet.

Auch Ihre Methode

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

ist ein generisches, die die gleiche Löschung hat und hängt nicht von den AbstractMapper generischen Parameter, die von MapStruct zu dem vieldeutigen Methodenfehler führt.

Ich bin mir nicht sicher, was Sie tatsächlich in der Methode tun. Aber wenn es etwas generisches ist, das nicht von den AbstractMapper generischen Parametern U und V abhängt, dann würde ich vorschlagen, dass Sie diese Methode in eine andere Klasse extrahieren und diese Klasse der uses Annotationsvariablen hinzufügen.

Wenn die Methode auf den Parametern abhängig ist, stellen Sie sicher, dass sie ein Teil davon sind, dann werden MapStruct korrekt funktionieren, da sie eine andere Art während der Kompilierung haben würde (U1, V1 oder U2, V2)

+0

Ich denke, dass Sie schreiben, ich sollte eine andere Klasse mit der Verwendung von Annotation (Lets nennen es MapperUtil) verwenden. Das Problem bleibt jedoch bestehen, wenn MapperA und MapperB die MapperUtil-Klasse verwenden. Die Methode wird weiterhin zweimal angezeigt. – teyma

+0

Nein, es wird nicht, wenn Sie die MapperUtill-Klasse verwenden, dann wird MapStruct wissen, dass es aus derselben Klasse stammt und es sollte kein Problem sein. Sehen Sie sich den Kommentar von @gunnar zu Ihrer Frage an.Wenn Sie die Typen in der 'resolveReference' verwenden, sollte es auch funktionieren. – Filip

+0

Danke für die Antwort, es funktioniert mit der MapperUtil-Klasse :) – teyma

Verwandte Themen