-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Closed
Labels
Milestone
Description
Expected behavior
When NullValuePropertyMappingStrategy.IGNORE is used, mapstruct must ignore updating a target field when a source field is null. This should work for all fields including collections ones.
Actual behavior
My setup is the following:
main entity object:
import java.util.List;
import lombok.Data;
@Data
public class MainEntity {
private String name;
private List<ChildEntity> childList;
}child entity object:
import lombok.Data;
@Data
public class ChildEntity {
private String myField;
}main dto object:
import java.util.List;
import lombok.Data;
@Data
public class MainDto {
private String name;
private List<ChildDto> childList;
}child dto object:
import lombok.Data;
@Data
public class ChildDto {
private String myField;
}My mapper is
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.TARGET_IMMUTABLE)
public interface EntityMapper {
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void update(@MappingTarget MainEntity target, MainDto source);
}Actual generated code is
public class EntityMapperImpl implements EntityMapper {
@Override
public void update(MainEntity target, MainDto source) {
if ( source == null ) {
return;
}
if ( source.getName() != null ) {
target.setName( source.getName() );
}
target.setChildList( childDtoListToChildEntityList( source.getChildList() ) );
}
protected ChildEntity childDtoToChildEntity(ChildDto childDto) {
if ( childDto == null ) {
return null;
}
ChildEntity childEntity = new ChildEntity();
childEntity.setMyField( childDto.getMyField() );
return childEntity;
}
protected List<ChildEntity> childDtoListToChildEntityList(List<ChildDto> list) {
if ( list == null ) {
return null;
}
List<ChildEntity> list1 = new ArrayList<ChildEntity>( list.size() );
for ( ChildDto childDto : list ) {
list1.add( childDtoToChildEntity( childDto ) );
}
return list1;
}
}As you can see childList in target is set to value returned from childDtoListToChildEntityList function which always returns null when the source list is null. So the target childList will be null. This is incorrect, the list must remain unchanged.
Note that this issue is only actual when collectionMappingStrategy = CollectionMappingStrategy.TARGET_IMMUTABLE
Steps to reproduce the problem
Use the above setup.
MapStruct Version
1.5.3.Final