«Ошибка определения типа» Ошибка при обработке ответа - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь обработать ответ, который я получаю через конечную точку отдыха. Я пытаюсь обработать ответ, но получаю эту ошибку

«Ошибка определения типа»

Вот как выглядит ответ

{
    "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();
     }

Это ошибка трассировки стека, которую я получаю, когда достигаю конечной точки

 {
    "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"
}

1 Ответ

0 голосов
/ 21 февраля 2020

Попробуйте использовать @ RequestBody для полезной нагрузки аргумента метода контроллера как:

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

Кроме того, предпочитайте конструкторам по умолчанию provinf вашим pojos

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...