Java &引用;类型定义错误“;处理响应时出错
我正试图通过rest端点获得流程响应。我正在尝试处理响应,但不断出现此错误 “类型定义错误” 这就是反应的样子Java &引用;类型定义错误“;处理响应时出错,java,spring-boot,Java,Spring Boot,我正试图通过rest端点获得流程响应。我正在尝试处理响应,但不断出现此错误 “类型定义错误” 这就是反应的样子 { "Body": { "stkCallback": { "MerchantRequestID": "QWERTY00000", "CheckoutRequestID": "200220202146218185", "ResultCode": "0", "Result
{
"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 +
'}';
}
}
这是我到达端点时得到的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"
}
尝试将控制器方法参数有效负载用作:
@PostMapping(value = "/stk-callback")
public String mpesaStkCalback(@RequestBody MpesaBody callbackResponse) throws IOException {
return callbackResponse.getBody().getStkCallback().getMerchantRequestID();
}
另外,更喜欢提供默认构造函数而不是POJO你能发布你的POJO和错误stackTrace.Hey吗。我已经更新了我的问题抱歉,这个“stacktrace错误”并没有说明太多(这是一个“rest响应”,告诉我们“一些内部服务器错误”…在“某个时间戳”),通过stacktrace我们希望得到一些“服务器日志”,它不是堆栈跟踪,而是JSON响应。500通常是代码中未处理的异常——您是否尝试过在该方法中设置断点并逐步了解它如何处理请求?由于缺少请求正文注释,
callbackResponse
很可能为空。嘿,谢谢,刚刚这么做了,用新错误更新了我的问题,我正在用您的更改和错误更新问题。此外,提供项目pojoUpdated。谢谢,它只是说没有def。犯人被发现了。尝试在所有POJO中添加默认(无参数)构造函数
@PostMapping(value = "/stk-callback")
public String mpesaStkCalback(@RequestBody MpesaBody callbackResponse) throws IOException {
return callbackResponse.getBody().getStkCallback().getMerchantRequestID();
}