2014-10-04 50 views
0

我有一個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() { 
    } 
} 

我現在的問題是,爲了使用orderService.add(order)保存Order對象,我需要根據請求中發送的值構造Order對象。我在哪裏/如何做到這一點?

OPTION 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對象的數據庫調用......我也不想讓請求對象中的映射的一半以及控制器中的其他映射都可以訪問服務。

OPTION 2

我可以用推土機進行映射,對我來說這將意味着將服務注入到這似乎同樣不乾淨我的推土機自定義轉換器......

OPTION 3

我將OrderRequest對象傳遞給服務層,並讓服務層處理它,但我的問題仍然存在,服務層如何轉換它,假設您有方法addOrder這樣的:

public void addOrder(OrderRequest orderRequest) { 

} 

你會調用另一個服務從一個轉換到另一個,因爲我真的不希望在業務邏輯方法,這種轉換?

任何幫助,將不勝感激

回答

0

使用@RequestBody映射你的JSONObject是與請求發送到DTO。

請參閱以下tutorial

希望有幫助。

請問有沒有不清楚的地方。