Установите значение LocalDateTime.now () в два поля при сопоставлении с помощью ModelMapper - PullRequest
0 голосов
/ 03 февраля 2020

Мне нужно сопоставить мой 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;
}

Я немного упростил их, просто удалив аннотации постоянства.

1 Ответ

0 голосов
/ 03 февраля 2020

Похоже, я нашел решение для меня.

Моя конфигурация для ModelMapper сейчас.

public OperationFormMapper(ModelMapper modelMapper) {
        this.modelMapper = modelMapper;

        Converter<OperationForm, Operation> converter = context -> {
            OperationForm src = context.getSource();
            Operation dest = new Operation();

            final LocalDateTime NOW = LocalDateTime.now();
            dest.setOperationKey(OperationKey.of(src.getLegalEntityId(), src.getEmployeeId(), NOW));
            dest.setIndividualId(src.getIndividualId());
            dest.setKey(src.getLegalEntityId() + "_" + src.getEmployeeId() + "_" + NOW);

            return dest;
        };

        this.modelMapper.addConverter(converter);
    }

Я создал Converter и вставил в него свой метод. Теперь это работает.

...