Каков наилучший способ заполнить сущность из DTO? - PullRequest
1 голос
/ 02 апреля 2019

Я создаю службу заказов, новую для мира RestServices.

Мне нужно прочитать модель заказа в OrderDTO и сохранить ее в БД.

Для этого у меня есть метод ниже:

@PostMapping(produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<OrderDTO> createOrder(@Valid @RequestBody OrderDTO orderDTO) {
    Order order = new Order(orderDTO);
    Order createdOrder = orderService.createOrder(order);
    OrderDTO createdOrderDTO = new OrderDTO(order);
    ResponseEntity<OrderDTO> responseEntity = new ResponseEntity<OrderDTO>(createdOrderDTO, null, HttpStatus.CREATED);
    return responseEntity;
}

Все работает нормально, но у меня есть сомнения по поводу текущего дизайна:

  1. Я читаювход в DTO
  2. Для сохранения объекта, который я преобразую, в объект Order, который будет сохранен Hibernate
  3. Снова, чтобы отправить ответ обратно, я преобразую объект фактического заказа в DTO.

наконец, я создам 4-5 объектов на запрос, если мое приложение получило 100 запросов, оно может столкнуться с проблемой памяти.

Как я могу читать данные модели и эффективно сохраняться?

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Я предпочитаю Mapper как Mapstruct:

OrderDtoMapper mapper = new OrderDTOMapper();

Order order = OrderDtoMapper.map(orderDto, Order.class);

и обратно:

OrderDTO createdOrderDTO = OrderDtoMapper.map(order, OrderDTO.class);

Для меня код выглядит более читабельным ... и вам не о чем писать, поскольку Mapstruct отображает это автоматически.Потому что, похоже, вы будете довольно много отображать;) Возможно, стоит попробовать картограф: http://mapstruct.org/

1 голос
/ 02 апреля 2019

В общем, предпочитают DTO из-за single responsibility principle, каждый объект несет свою ответственность, и также более ясно отделить View / Controller от объектов Model

Иногда можно уменьшить OrderDTO, используя объект, которыйэто и DTD, и реальный объект,

Он будет включать свойства DTD, а также другие свойства, которые вы можете добавить с помощью, например, компоновщика. Я использую @JsonIgnoreProperties(ignoreUnknown = true) для установки только свойств DTD, когда объект создается иззапрос, например:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public class Order 

Вы также можете использовать JsonGetter / JsonProperty / JsonSetter для управления ожидаемым / возвращаемым

@ JsonGetter и @JsonSetter старыеальтернативы @ JsonProperty.

0 голосов
/ 02 апреля 2019

Не вижу проблем с дизайном.

Как указал Низет. Созданные объекты недолговечны.

Обычно дизайн DTO и Entity используется для разделения пользовательского интерфейса и уровня обслуживания.

Таким образом, у вас есть возможность отфильтровывать конфиденциальную информацию от передачи в мир, например, пароль, пин-код.

Но если вы хотите, вы можете использовать Order сущность прямо в классе Controller.

Я не буду этого предлагать, но это возможно.

...