【问题标题】:RequestBody is not mapped to the objectRequestBody 未映射到对象
【发布时间】:2018-07-11 00:31:19
【问题描述】:

Requestbody 没有映射到我在这里使用的对象。 PaymentRequest 中的所有字段都为空。我看到注释和映射一切似乎都是正确的。

@RestController
@RequestMapping("/pay")
public class PaymentServiceAPIImpl {

    @RequestMapping(value = "/request", method = RequestMethod.POST)
    public Response submitPaymentRequest(@RequestBody PaymentRequest paymentRequest) {
        System.out.println(paymentRequest.getClientId()); // here I am getting all the fields are null
        return Response.ok().build();
    }
}    

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "payment_request", namespace = "http://www.abc-services.com/payment_request", propOrder = { "currencyCode", "clientId" })
public class PaymentRequest implements Serializable {

    private static final long serialVersionUID = 1L;
    @XmlElement(name = "currency_code")
    protected String currencyCode;
    @XmlElement(name = "client_id")
    protected String clientId;

    public String getCurrencyCode() {
        return currencyCode;
    }
    public void setCurrencyCode(String value) {
        this.currencyCode = value;
    }
    public String getClientId() {
        return clientId;
    }
    public void setClientId(String value) {
        this.clientId = value;
    }
}

这是请求

 curl -X POST \
  http://localhost:8080/pay/request \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: fead689c-239-284bb2116ae2' \
  -d '{
    "payment_token": {
        "client_id": "cyber",
        "currency_code": "USD"
    }
}'

将这样的支付请求发送到控制器中:

PaymentRequest {
     clientId: null,
     cardType: null,
     cardIssuer: null
 }

请求没有映射到 PaymentRequest 的任何指针?

【问题讨论】:

  • 您使用的是 XML ObjectMapper 吗?为什么要使用 java.xml 注释?
  • 您正在发布应用程序/json,但您的模型正在定义 XML 映射。
  • @SotiriosDelimanolis Spring MVC 使用映射实现很常见,该实现可以使用 XML 注释来定义 JSON 属性名称,允许代码以最少的定义共同支持 JSON 和 XML,从而允许客户端通过使用 AcceptContent-Type 标头来决定他们更喜欢 JSON 还是 XML。

标签: java rest spring-mvc


【解决方案1】:

您的代码没有映射数据,因为 JSON 是一个具有名为 payment_token 的单个属性的对象,而您的参数类型 PaymentRequest 没有该名称的属性。

要么将有效负载更改为:

{
    "client_id": "cyber",
    "currency_code": "USD"
}

或者改变参数类型来使用这个类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "payment_wrapper", namespace = "http://www.abc-services.com/payment_wrapper", propOrder = { "paymentToken" })
public class PaymentWrapper {

    @XmlElement(name = "payment_token")
    protected PaymentRequest paymentToken;

    public PaymentRequest getPaymentToken() {
        return paymentToken;
    }
    public void setPaymentToken(PaymentRequest value) {
        this.paymentToken = value;
    }
}

【讨论】:

    【解决方案2】:

    您的请求是 JSON 格式,但参数是 XML。 有所改变:

     curl -X POST \
     http://localhost:8080/pay/request \
     -H 'Cache-Control: no-cache' \
     -H 'Content-Type: application/json' \
     -H 'Postman-Token: fead689c-239-284bb2116ae2' \
     -d '{
            "clientId": "cyber",
            "currencyCode": "USD"
        }'
    
    public class PaymentRequest {
        protected String currencyCode;
        protected String clientId;
    
        public String getCurrencyCode() {
            return currencyCode;
        }
        public void setCurrencyCode(String value) {
            this.currencyCode = value;
        }
        public String getClientId() {
            return clientId;
        }
        public void setClientId(String value) {
            this.clientId = value;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 2017-03-16
      • 2019-02-17
      • 2019-11-10
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多