从请求对象到数据库

时间:2014-10-04 18:23:23

标签: spring spring-mvc

我有一个带有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,但在数据库中我也保存了productCodeproductName,所以我需要来自数据库的信息,但我不想从Request对象进行数据库调用...我也不想要请求对象中的一半映射和其他映射我可以访问服务的控制器。

选项2

我可以使用Dozer为我做映射,但这意味着将服务注入到Dozer自定义转换器中,这似乎对我来说同样不洁......

选项3

我将OrderRequest对象传递给服务层并让服务层处理它,但我的问题仍然存在,服务层究竟会如何转换它,比如你有这样的方法addOrder

public void addOrder(OrderRequest orderRequest) {

}

您是否会将其他服务从一个服务转换为另一个服务,因为我不想在业务逻辑方法中进行此转换?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

使用@RequestBody将随请求发送的jsonObject映射到DTO。

请参阅以下tutorial

希望有所帮助。

请问是否有不清楚的事情。