Мне нужно сопоставить мой DTO, который я получаю из пользовательского интерфейса с моей сущностью с помощью ModelMapper.
Перед использованием ModelMapper у меня был такой метод:
private Operation map(OperationForm src) {
Operation operation = new Operation();
LocalDateTime NOW = LocalDateTime.now();
operation.setOperationKey(OperationKey.of(src.getLegalEntityId(),
src.getEmployeeId(),
NOW)); // here
operation.setIndividualId(src.getIndividualId());
operation.setKey(src.getLegalEntityId() + "_"
+ src.getEmployeeId() + "_"
+ NOW); // and here
return operation;
}
В этом случае мне нужно создать новый LocalDateTime с помощью LocalDateTime.now () и использовать его в двух разных полях.
Итак, я попытался настроить ModelMapper следующим образом:
public OperationFormMapper(ModelMapper modelMapper) {
Converter<OperationForm, OperationKey> operationKeyConverter = (context) -> OperationKey.of(context.getSource().getLegalEntityId(),
context.getSource().getEmployeeId(),
LocalDateTime.now()); // generate new LocalDateTime to
// destination instance
Converter<Operation, String> keyConverter = (context) -> {
Operation src = context.getSource();
return src.getOperationKey().getLegalEntityId() + "_"
+ src.getOperationKey().getEmployeeId() + "_"
+ src.getOperationKey().getOperationDate();
}; // converter for my purpose
// I am trying to get value not from source,
// but from destination instance, hoping that
// all needed fields are already mapped
this.modelMapper = modelMapper;
this.modelMapper.addMappings(new PropertyMap<OperationForm, Operation>() {
@Override
protected void configure() {
using(operationKeyConverter).map(source, destination.getOperationKey());
map().setIndividualId(source.getIndividualId());
map().setOperationStatus(Operation.OperationStatus.CREATED);
using(keyConverter).map(destination, destination.getKey());
// trying to get all needed data from already mapped fields
}
});
}
Не удивительно, что это не сработало. Я получил NullPointerException. Очевидно, что поля все еще не сопоставлены в тот момент, когда я пытаюсь получить их значения для поля Key.
Итак, кто-нибудь знает, как обработать этот момент и заставить ModelMapper работать также для моего случая? Или, по крайней мере, есть несколько способов полностью настроить процесс отображения и создать весь метод, который будет использоваться ModelMapper для отображения (или заставить его использовать мой существующий сверху)?
ОБНОВЛЕНО:
Моя сущность:
public class Operation {
private OperationKey operationKey;
private Long individualId;
private String operationStatus;
private String operationResult;
private String guardCardSeries;
private String guardCardNumber;
private LocalDateTime guardCardStartDate;
private LocalDateTime guardCardEndDate;
private String resultMessage;
private String key;
}
Мой DTO от UI:
public class OperationForm implements Serializable {
private Long legalEntityId;
private Long employeeId;
private Long individualId;
}
Мой составной ключ для Cassandra DB:
public class OperationKey {
private final Long legalEntityId;
private final Long employeeId;
private final LocalDateTime operationDate;
}
Я немного упростил их, просто удалив аннотации постоянства.