【发布时间】:2019-04-02 04:45:36
【问题描述】:
我正在创建一个订单服务,这是 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;
}
一切正常,但我对当前的设计感到担忧:
- 我正在读取 DTO 的输入
- 将我正在转换的对象存储为将由 Hibernate 持久化的 Order 对象
- 再次发回响应,我将实际订单对象转换为 DTO。
最后我将为每个请求创建 4-5 个对象,如果我的应用收到 100 个请求,它可能会遇到内存问题。
如何读取模型数据并高效持久化?
【问题讨论】:
-
每个请求创建 4-5 个短期对象不会遇到任何内存问题。而 100 个请求绝对不算什么。
-
好的,感谢您的宝贵时间,有没有更好的方法来实现这一点?
-
我不会将 JPA 实体耦合到 DTO。我不会将结果包装到 ResponseEntity 中。我会使用不同的 DTO 来表示用户提交的创建新订单的内容,以及您选择返回的内容来描述订单。
-
我要强调将 DTO 与业务对象分开。他们不应该互相了解。通过让他们了解彼此,您将演示文稿 (DTO) 和服务/业务层(在您的 sn-p 中甚至是双向的)耦合在一起,这几乎总是一个设计缺陷。请注意,有些工具可以自动生成 DTO 和业务对象之间的映射工具。
-
正如@jannis 所建议的,您可以使用 MapStruct 在 DTO 和实体之间自动生成映射器。对于设计,我认为你做得很好。
标签: spring rest spring-boot dto