我在前端发了一个ajax电话。
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对象
但我不知道如何将从ajax发送的json对象映射到传递给spring控制器的参数?
答案 0 :(得分:0)
您的请求正文为application/x-www-form-urlencoded
(不是json),看起来像是:
marketplaceId=1&monetaryAmount%5Bamount%5D=100&monetaryAmount%5BcurrencyCode%5D=USD
问题1 是当我们使用application / x-www-form-urlencoded时,Spring并不将其理解为RequestBody。因此,如果我们想要使用它,我们必须删除@RequestBody注释。 More info
问题2 由于某种原因,Spring实际上很难理解百分比编码格式(%5D和%5B)。
另一个选择是创建响应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());
// ...
}