mapstruct / mapstruct/mapstruct-spring-extensions

Allow inherited DelegatingConverter to be processed

Offen
#104 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Java
Sterne
181
Forks
33
Ø Merge
2 T. 18 Std.
Gemergte PRs (30 T.)
3

Beschreibung

Related to https://github.com/mapstruct/mapstruct-spring-extensions/issues/101

Hi,

I am trying to modify the annotation processor to support custom Converter interface but I don't know how to process DelegatingConverter by inheritance.

New code in `ConverterMapperProcessor`:
```java
delegatingConverterDescriptors =
annotations.stream()
.filter(ConverterMapperProcessor::isDelegatingConverterAnnotation)
.map(roundEnv::getElementsAnnotatedWith)
.flatMap(Set::stream)
.map(ExecutableElement.class::cast)
// Do not generate delegate without Mapper annotation on class
.filter(annotatedMethod -> annotatedMethod.getEnclosingElement().getAnnotationMirrors().stream().anyMatch(x -> x.getAnnotationType().toString().equals(MAPPER)))
.map(annotatedMethod -> new DelegatingConverterDescriptor(annotatedMethod, processingEnv))
.collect(toList());
```

Custom converter:
```java
public interface BaseMapper extends Converter {

@Nullable
T convert(@NonNull S source, @Context CycleAvoidingMappingContext context);

@Nullable
@Override
@Named("baseConvert")
default T convert(@NonNull S source) {
return convert(source, new CycleAvoidingMappingContext());
}

// Annotation is not processed
@DelegatingConverter
@InheritInverseConfiguration
default S invertConvert(T source) {
return invertConvert(source, new CycleAvoidingMappingContext());
}

S invertConvert(T source, @Context CycleAvoidingMappingContext context);
}
```

Mapper:
```java
@Mapper(config = MapperConfig.class)
public abstract class CarMapper implements BaseMapper {

// Required annotation to have delegate generated by processor
@DelegatingConverter
@Override
public Car invertConvert(CarDto source) {
return BaseMapper.super.invertConvert(source);
}
}
```

Delegate:
```java
@Component
public class CarDtoToCarConverter implements Converter {
private CarMapper delegateMapper;

public CarDtoToCarConverter(@Autowired final CarMapper delegateMapper) {
this.delegateMapper = delegateMapper;
}

@Override
public Car convert(final CarDto source) {
return delegateMapper.invertConvert(source);
}
}
```

Wanted mapper:
```java
@Mapper(config = MapperConfig.class)
public abstract class CarMapper implements BaseMapper {
// Nothing to override
}
```

Thanks

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne in ConverterMapperProcessor und verfolge, wie @DelegatingConverter-Methoden aus roundEnv gesammelt werden; vergleiche diesen Pfad mit dem geerbten BaseMapper-Beispiel. Als erledigt gilt, wenn die Annotation auf BaseMapper.invertConvert für CarMapper ohne Override erkannt wird und der entsprechende Delegate generiert wird.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
tooling
Issue-Typ
Feature
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.