Expected behavior
Given the following source and target models (immutable code generated by the immutables framework):
@Value.Immutable
public interface ASource {
ImmutableBSource getB();
}
@Value.Immutable
public interface ATarget {
Optional<ImmutableBTarget> getB();
}
@Value.Immutable
public interface BSource {
String getS();
}
@Value.Immutable
public interface BTarget {
String getS();
}
and the following mapper definition:
public interface Mapper {
ImmutableATarget map(ImmutableASource value);
ImmutableBTarget map(ImmutableBSource value);
default <T> Optional<T> wrapAsOptional(T value) {
return Optional.ofNullable(value);
}
}
MapStruct 1.4.2 generated a correct mapper that uses the wrapOptional method for wrapping the b field in an optional after having converted it:
immutableATarget.b( wrapAsOptional( map( value.getB() ) ) );
Actual behavior
After upgrading to 1.5.3, MapStruct fails to generate a mapper and bails out with the following error message:
Can't map property "ImmutableBSource b" to "Optional<? extends com.bol.generics.ImmutableBTarget> b". Consider to declare/implement a mapping method: "Optional<? extends com.bol.generics.ImmutableBTarget> map(ImmutableBSource value)".
I expect it to generate a mapping method similar to the one generated by version 1.4.x.
Steps to reproduce the problem
See https://github.com/ntinnemeier/mapstruct-1.5-upgrade-bugs/tree/main/generics-with-immutables for a full example.
Switch between version 1.4.x and 1.5.x to see the difference in behaviour.
I couldn't reproduce this behaviour with vanilla Java domain objects. That is to say, domain objects that are not generated by the immutables framework. I haven't checked what happens when the domain classes are generated by Lombok.
MapStruct Version
MapStruct 1.5.3
Expected behavior
Given the following source and target models (immutable code generated by the immutables framework):
and the following mapper definition:
MapStruct 1.4.2 generated a correct mapper that uses the
wrapOptionalmethod for wrapping thebfield in an optional after having converted it:Actual behavior
After upgrading to 1.5.3, MapStruct fails to generate a mapper and bails out with the following error message:
Can't map property "ImmutableBSource b" to "Optional<? extends com.bol.generics.ImmutableBTarget> b". Consider to declare/implement a mapping method: "Optional<? extends com.bol.generics.ImmutableBTarget> map(ImmutableBSource value)".I expect it to generate a mapping method similar to the one generated by version 1.4.x.
Steps to reproduce the problem
See https://github.com/ntinnemeier/mapstruct-1.5-upgrade-bugs/tree/main/generics-with-immutables for a full example.
Switch between version 1.4.x and 1.5.x to see the difference in behaviour.
I couldn't reproduce this behaviour with vanilla Java domain objects. That is to say, domain objects that are not generated by the immutables framework. I haven't checked what happens when the domain classes are generated by Lombok.
MapStruct Version
MapStruct 1.5.3