我正在创建一个订单服务,新的RestServices世界。
我需要将order模型读入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;
}一切正常,但我对当前的设计感到担忧:
最后,我将创建每个请求4-5个对象,如果我的应用程序收到100个请求,它可能会遇到内存问题。
如何读取模型数据并有效地保持?
发布于 2019-04-02 11:06:11
一般来说,由于single responsibility principle的原因,DTO更好,每个对象都有自己的责任,将视图/控制器从模型对象中分离也更加清晰
有时可以减少OrderDTO,使用既为DTD又为实对象的对象,
它将包括DTD属性以及可以使用构建器添加的其他属性--例如,当从请求创建对象时,我只使用@JsonIgnoreProperties(ignoreUnknown = true)来设置DTD属性,例如:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public class Order 您还可以使用JsonGetter/JsonProperty/JsonSetter来控制预期/返回的内容。
@JsonGetter和@JsonSetter是@JsonProperty的老替代品。
发布于 2019-04-02 07:12:27
我更喜欢像Mapstruct这样的Mapper:
OrderDtoMapper mapper = new OrderDTOMapper();
Order order = OrderDtoMapper.map(orderDto, Order.class);然后回来:
OrderDTO createdOrderDTO = OrderDtoMapper.map(order, OrderDTO.class);对我来说代码看上去更易读..。在Mapstruct自动映射时,您没有太多可编写的东西。因为看起来你会绘制很多地图;)也许一个映射器值得一试:http://mapstruct.org/
发布于 2019-04-02 06:54:36
我不认为这个设计有任何问题。
正如尼泽特所指出的。创建的对象都是短暂的。
通常,DTO和实体设计是遵循的,以保持UI和服务层分离。
以这种方式,你可以选择过滤掉敏感的信息,从传递到世界的密码,别针。
但是,如果需要,可以在Controller类中直接使用Order实体。
我不建议,但这是可能的。
https://stackoverflow.com/questions/55467112
复制相似问题