无法将ajax json数据映射到spring控制器的对象参数

时间:2017-10-05 05:10:27

标签: ajax spring spring-mvc

我在前端发了一个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控制器的参数?

1 个答案:

答案 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)。

以下是解决此问题的方法: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());

        // ...
}
相关问题