2017-10-05 88 views
0

我在前端做了一個ajax post調用。無法將ajax json數據映射到彈簧控制器的對象參數

let data = { 
     marketplaceId: "1", 
     monetaryAmount: { 
      amount: 100, 
      currencyCode: "USD", 
     }, 
    } 

    $.post(posturl, data, function(returnedData) { 
      console.log(returnedData) 
     } 
     ).fail(function() { 
      console.log("error") 
     }) 

在我的spring mvc控制器中,我想將monetaryAmount json對象映射到java對象SimpleAmount。

SimpleAmount.java

public class SimpleAmount { 
    private BigDecimal amount; 
    private String currencyCode; 


    public BigDecimal getAmount() { 
    return this.amount; 
    } 

    public void setAmount(BigDecimal amount) { 
    this.amount = amount; 
    } 


    public String getCurrencyCode() { 
    return this.currencyCode; 
    } 

    public void setCurrencyCode(String currencyCode) { 
    this.currencyCode = currencyCode; 
    } 
} 

Controller.java

@RestController 
public class Controller { 

    @RequestMapping(value = "/rpl/updateasinlimit", method = RequestMethod.POST) 
    @ResponseBody 
    public BGCServiceResponseStatus updateAsinLimit(
      @RequestParam Long marketplaceId, 
      @RequestParam @RequestBody SimpleAmount monetaryAmount) { 

     ...... 
    } 
} 

然而,SimpleAmount monetaryAmount永遠不會被正確映射。在我看來,所有這些原始類型將很容易被映射,而不是Java對象

但我不知道我怎麼能映射從阿賈克斯後發送到傳遞到彈簧控制器參數的JSON對象?

回答

0

您的要求的身體application/x-www-form-urlencoded(不是JSON),看起來像:

marketplaceId=1&monetaryAmount%5Bamount%5D=100&monetaryAmount%5BcurrencyCode%5D=USD 

問題1是,當我們使用應用程序/ x-WWW窗體-urlencoded,春天沒有按」不要把它理解爲一個RequestBody。所以,如果我們想要使用它,我們必須刪除@RequestBody註解。 More info


問題2 春天實際上已經很難理解,出於某種原因百分號編碼格式(%5D和5B%)。


這裏是你如何解決這個問題:Post1Post2

還有一個選擇是創建響應POJO

public class SomeResponse { 
    private long marketplaceId; 
    private SimpleAmount monetaryAmount; 

} 

更改您的js代碼實際發送json,而不是application/x-www-form-urlencoded

$.ajax({ 
    type: 'POST', 
    url: "/rpl/updateasinlimit", 
    data: JSON.stringify(data), 
    success: function(data) { alert('data: ' + data); }, 
    contentType: "application/json", 
    dataType: 'json' 
}); 

然後你就可以在控制器使用它像這樣:

public String updateAsinLimit(
     @RequestBody SomeResponse pojo) { 
     System.out.println(pojo.getMarketplaceId()); 
     System.out.println(pojo.getMonetaryAmount()); 

     // ... 
}