Java – parsing soap services using retrofit I’m facing an exception (i.e. a mismatched body model in the class envelope model in the response)
This exception is encountered when parsing the response in soap services using retrofit Iam My exceptions are as follows
Failure: org.simpleframework.xml.core.ElementException: Element 'Body' does not have a match in class org.cainfo.arun.model.response.VerifyMobileResEnvelopeModel at line 1
This is my request and response
My request
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.router.ees.com/"> <soapenv:Header/> <soapenv:Body> <web:verifyMobile> <arg0>12345678</arg0> </web:verifyMobile> </soapenv:Body> </soapenv:Envelope>
My reply
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:verifyMobileResponse xmlns:ns1="http://webservice.router.ees.com/"> <return>name</return> </ns1:verifyMobileResponse> </soap:Body> </soap:Envelope>
VerifyMobileResEnvelopeModel
@Root(name = "soap:Envelope") @Namespace( prefix = "soap",reference = "http://schemas.xmlsoap.org/soap/envelope/") public class VerifyMobileResEnvelopeModel { @Element(name = "soap:Body",required = false) private VerifyMobileResBodyModel verifyMobileResBodyModel; public VerifyMobileResBodyModel getVerifyMobileResBodyModel() { return verifyMobileResBodyModel; } public void setBody(VerifyMobileResBodyModel verifyMobileResBodyModel) { this.verifyMobileResBodyModel = verifyMobileResBodyModel; } }
VerifyMobileResBodyModel
@Root(name = "soap:Body",strict = false) public class VerifyMobileResBodyModel { @Element(name = "ns1:verifyMobileResponse",required = false) @Namespace(prefix = "ns1",reference = "http://webservice.router.ees.com/") private VerifyMobileResDataModel verifyMobileResModel; public VerifyMobileResDataModel getVerifyMobileResModel() { return verifyMobileResModel; } public void setVerifyMobileResModel(VerifyMobileResDataModel verifyMobileResModel) { this.verifyMobileResModel = verifyMobileResModel; } }
VerifyMobileResDataModel
@Root(name = "ns1:verifyMobileResponse",strict = false) @Namespace(prefix = "ns1",reference = "http://webservice.router.ees.com/") public class VerifyMobileResDataModel { @Element(name = "return",required = false) private String customerName; public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } }
method
public void getResponse() { VerifyMobileRqstDataModel mVerifyMobileRqstDataModel = new VerifyMobileRqstDataModel(); mVerifyMobileRqstDataModel.phoneNo = mobileNo; VerifyMobileRqstBodyModel mVerifyMobileRqstBodyModel = new VerifyMobileRqstBodyModel(); mVerifyMobileRqstBodyModel.verifyMobileRqstDataModel = mVerifyMobileRqstDataModel; VerifyMobileRqstEnvelopeModel mVerifyMobileRqstEnvelopeModel = new VerifyMobileRqstEnvelopeModel(); mVerifyMobileRqstEnvelopeModel.verifyMobileRqstBodyModel = mVerifyMobileRqstBodyModel; Call<VerifyMobileResEnvelopeModel> call = webService.rqstVerifyMobileNo(mVerifyMobileRqstEnvelopeModel); call.enqueue(new Callback<VerifyMobileResEnvelopeModel>() { @Override public void onResponse(Call<VerifyMobileResEnvelopeModel> call,Response<VerifyMobileResEnvelopeModel> response) { if (response.isSuccessful() && response.body() != null) { // String customerName = response.body().verifyMobileResBodyModel.verifyMobileResModel.customerName; String customerName = response.body().getBody().getVerifyMobileResModel().getCustomerName(); Log.i("CustomerName",customerName); } } @Override public void onFailure(Call<VerifyMobileResEnvelopeModel> call,Throwable t) { Log.e("Failure",t.getMessage()); } }); }
I'm facing some analytical problems But it got a response In this method, it does not enter the response block, the fault block is executed, and it throws this exception Finding out the problem is troublesome I tried a lot Please have someone help me Thank you in advance
The response in my code But it does not enter the response block
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:verifyMobileResponse xmlns:ns1="http://webservice.router.ees.com/"> <return>Ramesh</return> </ns1:verifyMobileResponse> </soap:Body> </soap:Envelope>
Solution
Although it's too late, it may help some poor souls like me. I've had similar problems Try to set "strict = false" in the root tag of the ResponseBody, as shown below
@Root(name = "soap:Envelope",strict = false) @Namespace( prefix = "soap",reference = "http://schemas.xmlsoap.org/soap/envelope/") public class VerifyMobileResEnvelopeModel { @Element(name = "soap:Body",required = false) private VerifyMobileResBodyModel verifyMobileResBodyModel; public VerifyMobileResBodyModel getVerifyMobileResBodyModel() { return verifyMobileResBodyModel; } public void setBody(VerifyMobileResBodyModel verifyMobileResBodyModel) { this.verifyMobileResBodyModel = verifyMobileResBodyModel; } }