“类型定义错误”处理响应时发生错误

问题描述 投票:-1回答:1

我正在尝试处理我正在通过其他端点获得的响应。我正在尝试处理响应,但我一直收到此错误

“类型定义错误”

这是响应的样子

{
    "Body": {
        "stkCallback": {
            "MerchantRequestID": "QWERTY00000",
            "CheckoutRequestID": "200220202146218185",
            "ResultCode": "0",
            "ResultDesc": "The service request is processed successfully.",
            "CallbackMetadata": {
                "Item": [
                    {
                        "Name": "Amount",
                        "Value": 1
                    },
                    {
                        "Name": "ReceiptNumber",
                        "Value": "XXXXXXXX"
                    },
                    {
                        "Name": "Balance"
                    },
                    {
                        "Name": "TransactionDate",
                        "Value": 20200220214632
                    },
                    {
                        "Name": "PhoneNumber",
                        "Value": 0000000000
                    }
                ]
            }
        }
    }
}

我的Pojo类看起来像这样

public class MpesaBody {

    @SerializedName("Body")
    private Body body;

    public MpesaBody(Body body) {
        this.body = body;
    }

    public Body getBody() {
        return body;
    }

    public void setBody(Body body) {
        this.body = body;
    }

    @Override
    public String toString() {
        return "MpesaBody{" +
                "body=" + body +
                '}';
    }
}

public class Body {

    @Expose
    private StkCallback stkCallback;

    public Body(StkCallback stkCallback) {
        this.stkCallback = stkCallback;
    }

    public StkCallback getStkCallback() {
        return stkCallback;
    }

    public void setStkCallback(StkCallback stkCallback) {
        this.stkCallback = stkCallback;
    }

    @Override
    public String toString() {
        return "Body{" +
                "stkCallback=" + stkCallback +
                '}';
    }
}

public class StkCallback {

    @SerializedName("CallbackMetadata")
    private CallbackMetadata callbackMetadata;
    @SerializedName("CheckoutRequestID")
    private String checkoutRequestID;
    @SerializedName("MerchantRequestID")
    private String merchantRequestID;
    @SerializedName("ResultCode")
    private Long resultCode;
    @SerializedName("ResultDesc")
    private String resultDesc;

    public StkCallback(CallbackMetadata callbackMetadata, String checkoutRequestID, String merchantRequestID, Long resultCode, String resultDesc) {
        this.callbackMetadata = callbackMetadata;
        this.checkoutRequestID = checkoutRequestID;
        this.merchantRequestID = merchantRequestID;
        this.resultCode = resultCode;
        this.resultDesc = resultDesc;
    }

    public CallbackMetadata getCallbackMetadata() {
        return callbackMetadata;
    }

    public void setCallbackMetadata(CallbackMetadata callbackMetadata) {
        this.callbackMetadata = callbackMetadata;
    }

    public String getCheckoutRequestID() {
        return checkoutRequestID;
    }

    public void setCheckoutRequestID(String checkoutRequestID) {
        this.checkoutRequestID = checkoutRequestID;
    }

    public String getMerchantRequestID() {
        return merchantRequestID;
    }

    public void setMerchantRequestID(String merchantRequestID) {
        this.merchantRequestID = merchantRequestID;
    }

    public Long getResultCode() {
        return resultCode;
    }

    public void setResultCode(Long resultCode) {
        this.resultCode = resultCode;
    }

    public String getResultDesc() {
        return resultDesc;
    }

    public void setResultDesc(String resultDesc) {
        this.resultDesc = resultDesc;
    }

    @Override
    public String toString() {
        return "StkCallback{" +
                "callbackMetadata=" + callbackMetadata +
                ", checkoutRequestID='" + checkoutRequestID + '\'' +
                ", merchantRequestID='" + merchantRequestID + '\'' +
                ", resultCode=" + resultCode +
                ", resultDesc='" + resultDesc + '\'' +
                '}';
    }
}

public class CallbackMetadata {

    @SerializedName("Item")
    private List<Item> item;

    public CallbackMetadata(List<Item> item) {
        this.item = item;
    }

    public List<Item> getItem() {
        return item;
    }

    public void setItem(List<Item> item) {
        this.item = item;
    }

    @Override
    public String toString() {
        return "CallbackMetadata{" +
                "item=" + item +
                '}';
    }
}

这是处理回复的方式

  @PostMapping(value = "/stk-callback")
        public String mpesaStkCalback(@RequestBody MpesaBody callbackResponse) throws IOException {

        return callbackResponse.getBody().getStkCallback().getMerchantRequestID();
     }

这是我碰到端点时遇到的stacktrace错误

 {
    "timestamp": "2020-02-20T21:10:48.180+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Type definition error: [simple type, class com.poolafrica.billing.mpesa.model.MpesaBody]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.poolafrica.billing.mpesa.model.MpesaBody` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 1, column: 2]",
    "path": "/api/v1/billing/stk-callback"
}
java spring-boot
1个回答
0
投票

尝试将@RequestBody用于您的控制器方法参数有效负载为:

@PostMapping(value = "/stk-callback")
public String mpesaStkCalback(@RequestBody MpesaBody callbackResponse) throws IOException {
    return callbackResponse.getBody().getStkCallback().getMerchantRequestID();
 }

而且,更喜欢provinf默认构造函数而不是pojos

© www.soinside.com 2019 - 2024. All rights reserved.