ModelMapper: 空对象属性映射错误

3

我正试图将源对象中的属性设置为null,然后映射到目标对象,而该目标对象的该属性已被设置为另一个对象。

期望的结果是在映射后,目标对象的属性将为null。但实际上,该属性被设置为一个对象,并且其所有属性都被设置为null

以下是一个例子:

public class ModelMapperTest {
    public static void main(String[] args) {
        ModelMapper modelMapper = new ModelMapper();

        User user = new User();
        user.setStatus(null);

        StatusDto statusDto = new StatusDto();
        statusDto.setId(1);
        statusDto.setName("Active");

        UserDto userDto = new UserDto();
        userDto.setStatus(statusDto);

        // user.status=null, userDto.status=StatusDto(id=1, name="Active")
        modelMapper.map(user, userDto);

        System.out.println("user = " + user);
        System.out.println("userDto = " + userDto);
    }    

    @Getter
    @Setter
    @ToString
    public static class User {
        private Status status;
    }

    @Getter
    @Setter
    @ToString
    public static class Status {
        private Integer id;
        private String name;
    }

    @Getter
    @Setter
    @ToString
    public static class UserDto {
        private StatusDto status;
    }

    @Getter
    @Setter
    @ToString
    public static class StatusDto {
        private Integer id;
        private String name;
    }
}

输出:

user = ModelMapperTest.User(status=null)
userDto = ModelMapperTest.UserDto(status=ModelMapperTest.StatusDto(id=null, name=null))

是否可以通过配置model mapper将UserDto.status设置为null?


我发现ModelMapper库存在问题。我们决定改用MapStruct - Tuom
1个回答

2

我知道这是一个比较旧的问题,而且您似乎已经转向了另一个库,但最近我遇到了同样的问题,并想出了这个解决方案(基于您的示例):

  Converter<?, ?> preserveNullConverter = (context) ->
     context.getSource() == null
        ? null
        : modelMapper.map(context.getSource(), context.getDestinationType());

  modelMapper.createTypeMap(User.class, UserDto.class)
     .addMappings(mapper -> mapper.using(preserveNullConverter).map(User::getStatus, UserDto::setStatus));

这并不是理想的解决方案,因为.addMappings需要针对每个出现问题的属性进行操作,但至少可以重复使用转换器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接