Как сообщить функции карты MapperModel, что конкретный файл должен иметь определенное значение?

#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 напрямую, пропустите часть преобразователя.