#java #spring #mapping #modelmapper
Вопрос:
Я использую ModelMapper в своем проекте для сопоставления классов DTO и моделей.
Например:
public class UserDto {
private String name;
private String phone;
private String email;
}
public class User {
@Id
private String id;
private String metaDatal;
private String name;
private String phone;
private String email;
}
Вот как я это отображаю:
@Autowired
private ModelMapper modelMapper;
modelMapper.map(userDto, user);
Как вы можете видеть, у меня есть метаданное поле в пользовательской модели, я хочу задать этому полю определенное значение.
В конкретном поле(метаданном) сопоставленного класса я хочу установить это значение «abc123». Есть ли способ указать методу карты, когда он вызывается, что конкретный файл(например, метаданные) должен иметь определенное значение(например, abc123)?
Комментарии:
1. Инициализируйте
metaData
поле нужным значением. (и пропустите полеtypeMap.addMappings(mapper -> mapper.skip(User::setMetaDatal));
)
Ответ №1:
Я считаю, что самый гибкий способ сделать это-реализовать простой Converter
. Проверьте это:
Converter<UserDto, User> metaData = new Converter<UserDto, User>() {
// This is needed to convert as usual but not having not registered
// this converter to avoid recursion
private final ModelMapper mm = new ModelMapper();
@Override
public User convert(MappingContext<UserDto, User> context) {
User u = context.getDestination();
mm.map(context.getSource(), u);
u.setMetaDatal("abc123");
return context.getDestination();
}
};
Теперь осталось просто создать TypeMap
и настроить этот конвертер для обработки преобразования, например:
modelMapper.createTypeMap(UserDto.class, User.class).setConverter(metaData);
до modelMapper.map()
.
Вы также можете добавить средство получения метаданных в свой UserDto
, например:
public String getMetaDatal() {
return "abc123";
}
Если это что-то, из чего можно извлечь UserDto
напрямую, пропустите часть преобразователя.