-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Description
Expected behavior
MapStruct doesn't report properties that aren't backed by a real field, and no warnings about this are issued. If the unmapped target policy is ERROR, the code gets compiled.
Actual behavior
When mapping from type A to type B, if type B has a getter method that returns collections, MapStruct treats it as a property to be populated. If the unmapped target policy is ERROR, an error is raised respectively.
A "collection" is used here as a collective term for really more than just j.u.Collection. Here are the types I tested this with and which were marked unmapped: Collection (List, Set, Queue, Deque), Map, Stream. What's worth nothing is that Iterable, Iterator, and Optional are fine.
Since the others are probably tested for their collection-ness with a single helper method, it also may be worthwhile marking Iterable, Iterator and Optional as collection types too.
Steps to reproduce the problem
public static class Foo {
List<String> values;
public List<String> getValues() { return values; }
public void setValues(List<String> values) { this.values = values; }
}
public static class Bar {
List<String> values;
public List<String> getValues() { return this.values; }
public void setValues(List<String> values) { this.values = values; }
// This is the root of the problem; try replacing with any non-collection type.
public Stream<String> getX() {
throw new UnsupportedOperationException();
}
}
@Mapper
public interface BarMapper {
@Mapping(target = "values", source = "values")
Bar toBar(Foo foo);
}MapStruct Version
1.5.5.Final