Error occurred while buffering incoming SOAP message using Metro client
Asked Answered
K

1

6

I am using Metro 2 client to consume the "Secure wcf web service in Java". But Metro client does not gives any response and stay in hang mode after very long time it produce the output as an error:

Stack Trace:

SEVERE: WSSMSG0001: Error occurred while buffering incoming SOAP message.
com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x1a
 at [row,col {unknown-source}]: [1,6396222]
    at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
    at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
    at com.ctc.wstx.sr.StreamScanner.reportIllegalChar(StreamScanner.java:2442)
    at com.ctc.wstx.sr.StreamScanner.validateChar(StreamScanner.java:2389)
    at com.ctc.wstx.sr.StreamScanner.resolveCharEnt(StreamScanner.java:2355)
    at com.ctc.wstx.sr.StreamScanner.fullyResolveEntity(StreamScanner.java:1501)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2726)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1065)
    at com.sun.xml.ws.util.xml.XMLStreamReaderToXMLStreamWriter.bridge(XMLStreamReaderToXMLStreamWriter.java:142)
    at com.sun.xml.ws.message.stream.StreamMessage.writePayloadTo(StreamMessage.java:376)
    at com.sun.xml.ws.message.stream.StreamMessage.writeEnvelope(StreamMessage.java:412)
    at com.sun.xml.ws.message.stream.StreamMessage.writeTo(StreamMessage.java:390)
    at com.sun.xml.ws.security.message.stream.LazyStreamBasedMessage.readMessage(LazyStreamBasedMessage.java:476)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.verifyInboundMessage(SecurityTubeBase.java:444)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientResponsePacket(SecurityClientTube.java:434)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processResponse(SecurityClientTube.java:362)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:972)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775)
    at com.sun.xml.ws.client.Stub.process(Stub.java:429)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:168)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151)
    at $Proxy44.pullCustomers(Unknown Source)
    at com.tekriti.client.Client.test(Client.java:106)
    at com.tekriti.client.Client.main(Client.java:44)
com.sun.xml.ws.encoding.soap.DeserializationException: Failed to read a response: javax.xml.bind.UnmarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: Internal XSB error: Invalid State=0]
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:141)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151)
    at $Proxy44.pullCustomers(Unknown Source)
    at com.tekriti.client.Client.test(Client.java:106)
    at com.tekriti.client.Client.main(Client.java:44)
Caused by: javax.xml.bind.UnmarshalException

I am trying to fix this issue but no luck, Metro client is unable to parse the SOAP response in a correct way. I don't know where I am doing mistake or I have to use something else.
I am using Netbeans 7.1 and Metro 2.2.

Please give your suggestions or if you had such problem in your past please do share with me.

updated:

This is working fine:

     Dispatch<Source> sourceDispatch = null;
     sourceDispatch = service.createDispatch(portQName, Source.class, Service.Mode.MESSAGE);

     ((BindingProvider)sourceDispatch).getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, "http://cdx.dealerbuilt.com/Api/0.97/IStandardApi/PullCustomers");
    ((BindingProvider)sourceDispatch).getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
   Source result = sourceDispatch.invoke(new StreamSource(new StringReader(req)));

req contains the below one:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <Action>http://cdx.dealerbuilt.com/Api/0.97/IStandardApi/PullCustomers</Action>
    </s:Header>
    <s:Body>
        <PullCustomers xmlns="http://cdx.dealerbuilt.com/Api/0.97/">
            <searchCriteria xmlns:d4p1="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <d4p1:ActivityStoreIds xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                    <d5p1:long>64</d5p1:long> 
                </d4p1:ActivityStoreIds>

                <d4p1:EnvironmentIds xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
                    <d5p1:long>27</d5p1:long>      
                </d4p1:EnvironmentIds>
            </searchCriteria>
        </PullCustomers>
    </s:Body>
</s:Envelope>

But it produces Source in output and takes SOAP envelope in request.

I Need this should be work.

   org.tempuri.StandardApi service = new org.tempuri.StandardApi();
   CustomerSearchCriteriaType criteriaType = new CustomerSearchCriteriaType();

   QName environmentQName = new QName("http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi", "EnvironmentIds");
   ArrayOflong arrayOflong = new ArrayOflong();
   arrayOflong.getLong().add(27l);
   JAXBElement<ArrayOflong> environmentIds = new JAXBElement<ArrayOflong>(environmentQName, ArrayOflong.class, arrayOflong);
   criteriaType.setEnvironmentIds(environmentIds);

   QName activityQName = new QName("http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi", "ActivityStoreIds");
   ArrayOflong arrayOfActivity = new ArrayOflong();
   arrayOfActivity.getLong().add(64l);
   JAXBElement<ArrayOflong> activityIds = new JAXBElement<ArrayOflong>(activityQName, ArrayOflong.class, arrayOfActivity);
   criteriaType.setActivityStoreIds(activityIds);

   ArrayOfCustomerType customers = service.getCustomBindingIStandardApi().pullCustomers(criteriaType);
   if (customers != null) {
       System.out.println("Size of Customers::::" + customers.getCustomer().size());
   }

Request contains

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <PullCustomers xmlns="http://cdx.dealerbuilt.com/Api/0.97/">
            <searchCriteria>
                <ActivityStoreIds xmlns="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi">
                    <long xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">64</long>
                </ActivityStoreIds>
                <EnvironmentIds xmlns="http://schemas.datacontract.org/2004/07/DealerBuilt.BaseApi">
                    <long xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">27</long>
                </EnvironmentIds>
            </searchCriteria>
        </PullCustomers>
    </soapenv:Body>
</soapenv:Envelope>

But it hangs while producing output and after very long time it produce the error mentioned above.

Is the difference between the requests causes the problem or something else?

Kayleen answered 2/4, 2012 at 9:6 Comment(0)
G
6

I think the data web-service is returning to client contain illegal character 0x1a which is EOF.
XML doesn't allow CONTROL CHAR in it. As you are using SOAP ultimately XML.

See the similar issue: illegal character in xml document

solution:
1. Either you can eliminate CONTROL char
2. Or Encode it in web-service and decode it at SOAP client.

Garman answered 5/4, 2012 at 11:41 Comment(5)
Thanks for reply can you please see my update 1 is there any issue in difference between request?Kayleen
@Kayleen Do you mean if request are different you receives SOAP message from web-service?Garman
Thanks again for quick response, When i change the request type form 1 to second request type, then it'll produce the same error and then produce the output also.Kayleen
@Kayleen With any of the situation you have to handle the exception, isn't it? Have you checked whether SOAP response contain EOF char or not?Garman
SOAP response doesn't contain any EOF char I am sure. I think the main problem is in request my second request is not so good to produce the output.Kayleen

© 2022 - 2024 — McMap. All rights reserved.