首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从DTO填充实体的最佳方法是什么?

从DTO填充实体的最佳方法是什么?
EN

Stack Overflow用户
提问于 2019-04-02 04:45:36
回答 3查看 2.5K关注 0票数 2

我正在创建一个订单服务,新的RestServices世界。

我需要将order模型读入OrderDTO中,并在DB中持久化。

为此,我有以下方法:

代码语言:javascript
复制
@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. 同样,为了返回响应,我将实际的order对象转换为DTO。

最后,我将创建每个请求4-5个对象,如果我的应用程序收到100个请求,它可能会遇到内存问题。

如何读取模型数据并有效地保持?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-02 11:06:11

一般来说,由于single responsibility principle的原因,DTO更好,每个对象都有自己的责任,将视图/控制器从模型对象中分离也更加清晰

有时可以减少OrderDTO,使用既为DTD又为实对象的对象,

它将包括DTD属性以及可以使用构建器添加的其他属性--例如,当从请求创建对象时,我只使用@JsonIgnoreProperties(ignoreUnknown = true)来设置DTD属性,例如:

代码语言:javascript
复制
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public class Order 

您还可以使用JsonGetter/JsonProperty/JsonSetter来控制预期/返回的内容。

@JsonGetter和@JsonSetter是@JsonProperty的老替代品。

票数 2
EN

Stack Overflow用户

发布于 2019-04-02 07:12:27

我更喜欢像Mapstruct这样的Mapper:

代码语言:javascript
复制
OrderDtoMapper mapper = new OrderDTOMapper();

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

然后回来:

代码语言:javascript
复制
OrderDTO createdOrderDTO = OrderDtoMapper.map(order, OrderDTO.class);

对我来说代码看上去更易读..。在Mapstruct自动映射时,您没有太多可编写的东西。因为看起来你会绘制很多地图;)也许一个映射器值得一试:http://mapstruct.org/

票数 1
EN

Stack Overflow用户

发布于 2019-04-02 06:54:36

我不认为这个设计有任何问题。

正如尼泽特所指出的。创建的对象都是短暂的。

通常,DTO和实体设计是遵循的,以保持UI和服务层分离。

以这种方式,你可以选择过滤掉敏感的信息,从传递到世界的密码,别针。

但是,如果需要,可以在Controller类中直接使用Order实体。

我不建议,但这是可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55467112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档