ModelMapper:Incorect 属性 从空对象映射
ModelMapper: Incorect property mapping from null objects
我正在尝试将 属性 设置为 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;
}
}
输出:
用户 = ModelMapperTest.User(status=null)
userDto = ModelMapperTest.UserDto(status=ModelMapperTest.StatusDto(id=null, name=null))
是否可以通过某种方式配置模型映射器以将 UserDto.status
设置为空?
我知道这是一个较旧的问题,您似乎已经转移到另一个库,但我最近遇到了同样的问题并提出了这个解决方案(基于您的示例):
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
部分需要为出现问题的每个 属性 完成,但至少转换器可以重复使用。
我正在尝试将 属性 设置为 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;
}
}
输出:
用户 = ModelMapperTest.User(status=null) userDto = ModelMapperTest.UserDto(status=ModelMapperTest.StatusDto(id=null, name=null))
是否可以通过某种方式配置模型映射器以将 UserDto.status
设置为空?
我知道这是一个较旧的问题,您似乎已经转移到另一个库,但我最近遇到了同样的问题并提出了这个解决方案(基于您的示例):
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
部分需要为出现问题的每个 属性 完成,但至少转换器可以重复使用。