Hi,
1. Optional<String> -> String - you need to define a custom method
2. int -> String - MapStruct will use toString(), if you need other conversation mechanisms you need to define a custom method
3. @Mapping(target = "isAlive", ignore = true) and @Mapping(target = "middleName", ignore = true) is useless - target object does not have such properties.
4. @Mapping(target = "fullName", qualifiedByName = "getFullName") - is incorrect, use source = ".", using the qualifiedByName is redundantly because the custom method is unique (PersonDto -> String)
5. Check the generated PersonMapperImpl to ensure that correct mappings are generated
So
public class Address {
private String firstLineAddress;
private String secondLineAddress;
private String postCode;
private String phoneNumber;
private int period;
}
@Data
public class PersonDto {
private String firstName;
private String lastName;
private String middleName;
private String personId;
private boolean alive;
private Optional<String> occupation;
private Address address;
}
public class Person {
private String firstName;
private String lastName;
private String fullName;
private String occupation;
private String firstLineAddress;
private String secondLineAddress;
private String postCode;
private String phoneNumber;
private String period;
@Mapper(componentModel = "spring")
public interface PersonMapper {
@Mapping(target = "period", source = "address.period")
@Mapping(target = "firstLineAddress", source = "address.firstLineAddress")
@Mapping(target = "secondLineAddress", source = "address.secondLineAddress")
@Mapping(target = "postCode", source = "address.postCode")
@Mapping(target = "phoneNumber", source = "address.phoneNumber")
@Mapping(target = "fullName", source = ".")
Person toPerson(final PersonDto domain);
//dynamically getting the fullName
default String fullName(final PersonDto personDto) {
if (StringUtils.isNotBlank(personDto.getFirstName()) && StringUtils.isNotBlank(personDto.getLastName())) {
return String.join(" ", personDto.getFirstName(), personDto.getLastName());
}
return null;
}
default String str(final Optional<String> str) {
return str.orElse(null);
}
}