我有一个带有AngularJS前端和Spring MVC后端的应用程序。我在将请求对象转换/映射到域/ dto对象时遇到了一些麻烦。
在一个页面上,您可以向系统添加新订单,POST有效负载将如下所示:
{
memo: "This is some extra info for order",
orderLines: [{productId:3, quantity:4}, {productId:2, quantity:5}, {productId:1, quantity:4}],
shippingDate: "2014-10-08T19:16:19.947Z",
warehouseId: 2
}
Spring MVC控制器方法如下所示:
@RequestMapping(value = "/order", method = RequestMethod.POST)
public ResponseEntity<Void> addOrder(@RequestBody @Valid OrderRequest orderRequest, UriComponentsBuilder b) throws Exception {
// the magic
}
在OrderRequest填充POST请求的值的情况下,OrderRequest和OrderLineRequest如下所示:
public class OrderRequest {
private Long id;
private Date shippingDate;
private String memo;
private List<OrderLineRequest> orderLines;
private Long warehouseId;
public OrderRequest() {
}
// getters and setters ommitted
}
public class OrderLineRequest {
private Long id;
private String productCode;
private int quantity;
public OrderLineRequest() {
}
}
我现在的问题是,为了使用Order
保存orderService.add(order)
对象,我需要根据请求中发送的值构造Order对象。我在哪里/怎么做?
选项1
OrderRequest
类可以使用makeOrder()
方法,只返回Order
对象,如下所示:
public Order makeOrder() {
Order order = new Order();
order.setMemo(this.memo);
order.setShippingDate(this.shippingDate);
...
}
然后我必须映射OrderLineRequest
,它们可能有自己的makeOrderLine
方法:
public OrderLine makeOrderLine() {
OrderLine orderLine = new OrderLine();
orderLine.setQuantity = this.quantity;
...what to do with only the productId?
}
如您所见,我可以设置数量,但在请求中我只收到了productId
,但在数据库中我也保存了productCode
,productName
,所以我需要来自数据库的信息,但我不想从Request对象进行数据库调用...我也不想要请求对象中的一半映射和其他映射我可以访问服务的控制器。
选项2
我可以使用Dozer为我做映射,但这意味着将服务注入到Dozer自定义转换器中,这似乎对我来说同样不洁......
选项3
我将OrderRequest对象传递给服务层并让服务层处理它,但我的问题仍然存在,服务层究竟会如何转换它,比如你有这样的方法addOrder
:
public void addOrder(OrderRequest orderRequest) {
}
您是否会将其他服务从一个服务转换为另一个服务,因为我不想在业务逻辑方法中进行此转换?
任何帮助将不胜感激