当前位置: 首页 > 知识库问答 >
问题:

从DTO填充实体的最佳方式是什么

蒋原
2023-03-14

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

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

为此,我有以下方法:

@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. 要存储对象,我将转换为订单对象,它将由Hibernate保存
  3. 再次发送响应回来,我正在将实际的订单对象转换为DTO。

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

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

共有3个答案

汪安然
2023-03-14

我看不出设计有任何问题。

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

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

通过这种方式,您可以选择过滤掉传递给世界的敏感信息,如密码pin。

但是如果你愿意,你可以直接在Controller类中使用订单实体。

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

柳修为
2023-03-14

我更喜欢像Mapstruct这样的Mapper:

OrderDtoMapper mapper = new OrderDTOMapper();

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

和回:

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

对我来说,代码看起来更可读...你没有太多可写的,因为Mapstruct会自动映射它。因为看起来你会映射很多;)也许映射器值得一试:http://mapstruct.org/

姬国安
2023-03-14

一般来说,更喜欢DTO,因为单一责任原则,每个对象都有自己的责任,而且将View/Controller与Model对象分开也更清楚

有时,您可以将OrderDTO减少为,使用一个既是DTD又是真实对象的对象,

它将包括DTD属性以及您可以使用builder添加的其他属性。例如,我使用@JsonIgnoreProperties(ignoreUnknown=true)在根据请求创建对象时仅设置DTD属性,例如:

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

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

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

 类似资料:
  • 问题内容: 我已经看到了许多不同的方法来创建和填充数字表。但是,创建和填充一个的最佳方法是什么?从“最重要”到“最不重要”定义“最佳”: 用最佳索引创建的表 产生最快的行 用于创建和填充的简单代码 问题答案: 这是一些从网上获取的代码示例,以及对该问题的解答。 对于每种方法,我都修改了原始代码,因此每种方法都使用相同的表和列:NumbersTest和Number,具有10,000行或尽可能接近的行

  • 我这里有一个相对复杂的JavaCRUD用Swing组件编写。我正在考虑在JavaFX中重写它的GUI。现在的问题是: 我创建了一个类,用于保存下载的数据、存储SQL命令和有关任何给定表的其他信息。我在表的构造函数中定义了该表的数据结构。这样地: 这样一来,每当数据库表结构发生变化时,我就不必接触这个类的代码。我将镜像构造函数中的更改,并相应地编辑GUI。 (在类内部,数据存储为ArrayList。

  • 问题内容: 我是NHibernate(和ORMS)的新手,并试图掌握它提供的各种选择。作为参考,我将Fluent NHibernate与单独的业务对象配合使用,而后者又将DTO纯粹用于数据访问。我的应用程序体系结构必须同时支持Windows和Web“前端”。 我的选择是一般方法之一,因为似乎有很多选择。我的DTO看起来像下面的示例。每个DTO都有对ISession的引用,该引用从BO传递给它们。他

  • 我们有一个微型应用程序,它由前端开发人员组装起来,然后“翻墙而去”。它定义了一个属性文件settings.js: 由html引用: 我想在运行时在application.yml中定义solr路径,如下所示: ) 可能 我曾考虑将'settings.js'作为一个Tymeleaf模板(settings.js.html),并让一个spring控制器从application.properties填充模型

  • 我正在用Spring Boot开发一个简单的todo应用程序。我正在使用JWT进行授权。将使用以下endpoint获取属于用户的所有TODO。 我这里有两个问题: 从令牌获取用户名是一种很好的做法吗 使用令牌从控制器类或服务类访问用户名的最佳方式是什么 这个答案显示了如何从控制器类访问令牌。但如果我们想从服务类访问令牌,该怎么办?这个答案说明了这一点。但该类已被弃用。

  • 问题内容: 当前,我们的开发团队使用这种模式,但是我不禁想知道是否存在更快或更有效的html方式来完成同一任务。 的HTML 这是Javascript: 问题答案: 这是我为此编写的函数。我不确定它是否比jQuery Templates更快。 它一次创建并附加一个Option元素,这可能比Templates慢 。我怀疑Templates会构建整个HTML字符串,然后一次创建所有DOM元素。那可能更