I recently added mapStruct in my project. This framework is cool, but I can not figure out one thing.
This is my case: I have Profile
entity and field with the Person
type. I want to update it using ProfileDto
. I am using void fromDto(ProfileDto dto, @MappingTarget Profile entity)
method for this. The problem is that mapper always create new Person instead of using person from profile
entity
My entity is:
public class Profile {
private Person person;
.. setters, getters and constructors
}
public class Person extends AbstractEntity {
private String name;
private String surname;
.. setters, getters and constructors
}
Dto
public class ProfileDto extends AbstractDto {
private String name;
private String surname;
.. setters, getters and constructors
}
my mapper
public abstract class ProfileMapper {
@Mappings({
@Mapping(target = "name", source = "entity.person.name"),
@Mapping(target = "surname", source = "entity.person.surname")
})
public abstract ProfileDto toDto(Profile entity);
@InheritInverseConfiguration(name = "toDto")
public abstract void fromDto(ProfileDto dto, @MappingTarget Profile entity);
}
generated code
@Override
public void fromDto(ProfileDto dto, Profile entity) {
if ( dto == null ) {
return;
}
Person person = new Person();
entity.setPerson( person );
...
I don't need to create new instance of person here
person = new Person();
I what somehow to replace this string with:
person = entity.getPerson()
First, you need to add mapstruct and mapstruct-processor to your project's dependencies. The latter will be used by MapStruct to generate the mapper implementations during build-time. Besides a MapStruct dependency, a maven-compiler-plugin plugin must be also configured in your pom. xml file.
Enclosing class: MappingConstants public static final class MappingConstants.ComponentModel extends Object. Specifies the component model constants to which the generated mapper should adhere. It can be used with the annotation Mapper.componentModel() or MapperConfig.componentModel()
Annotation Type MappingTargetDeclares a parameter of a mapping method to be the target of the mapping. Not more than one parameter can be declared as MappingTarget . NOTE: The parameter passed as a mapping target must not be null .
During compilation, MapStruct will generate an implementation of this interface. This implementation uses plain Java method invocations for mapping between source and target objects, i.e. no reflection or similar.
This is a known issue, see #1011. This has been improved in 1.2.0
(at the time of writing 11.07.2017 the latest version is 1.2.0.Beta3
). You should try the latest version, it should work as expected.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With