java - ModelMapper:来自空对象的 Incorect 属性映射

标签 java mapping modelmapper

我正在尝试将属性设置为 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))

是否可以通过某种方式配置模型映射器以将 UserDto.status 设置为 null?

最佳答案

我知道这是一个较旧的问题,您似乎已经转移到另一个库,但我最近遇到了同样的问题并提出了这个解决方案(以您的示例为基础):

  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 部分,但至少可以重用 Converter。

关于java - ModelMapper:来自空对象的 Incorect 属性映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60597589/

相关文章:

sql - 使用 SQL 和 Linq 的多对多关系( Entity Framework /实体)

java - 使用 ModelMapper 防止循环引用 - 列表

java - 使用自定义方法为 ModelMapper 定义映射

java - struts2 Ajax错误?

java - JDBC 的执行查询错误

Hibernate @EmbeddedId + join

linux - 域映射到子域

java - 使用 ModelMapper 将 DTO 映射到实体(包括异常)

当 JNLP 固定为 JRE 1.6 并且安装了 JRE 1.7 时,Java WebStart 启动失败

java - 图像作为 JScrollPane 中的背景