I am using Mapstruct to handle boilerplate code of mapping one POJO to another.
Here is the DTO:
import java.util.Collection;
public class TestTO {
String name;
Collection<AttributeTO> attributes;
}
Here is the mapped POJO:
import java.util.Map;
public class Test {
String name;
Map<String, Attribute> attributes;
}
I am looking for an elegant way to handle the mapping between the Map
and the Collection
. Currently, I am using the expression
attribute of the @Mapping
annotation. Since Attribute
references Test
I am using a CycleBreakingContext
from the "mapping with cycles" example.
@Mapping(target = "attributes", expression = "java(test.getAttributes().values().stream().map(a -> this.map(a, context)).collect(java.util.stream.Collectors.toList()))")
abstract TestTO map(Test test, @Context CycleBreakingContext context);
The interface also contains a method mapping Attribute
to AttributeTO
with the name map
.
Is there a more elegant way to implement this conversion of a non-iterable Map
to a Collection
? My approach is working but has it's downsides. Refactoring, for instance, does not recognise code fragments in Strings.
How about default mapper methods?
In your mapper interface you can provide default implementation instructing MapStruct on how to map given types, for example:
This method will be called whenever MapStruct tries to map from Map to Collection.
You are free to customize it as much as you want.