6

Ich verwende Metro 2 Client, um den "sicheren wcf-Webdienst in Java" zu verwenden. Aber Metro-Client gibt keine Antwort und bleibt in hängen Modus nach sehr langer Zeit, die die Ausgabe als Fehler erzeugen:Fehler beim Puffern eingehender SOAP-Nachrichten mit dem Metro-Client

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 

Ich versuche, dieses Problem zu beheben, aber keine Glücklicherweise kann der Metro-Client die SOAP-Antwort nicht korrekt analysieren. Ich weiß nicht, wo ich Fehler mache oder etwas anderes brauche.
Ich verwende Netbeans 7.1 und Metro 2.2.

Bitte geben Sie Ihre Vorschläge oder wenn Sie ein solches Problem in Ihrer Vergangenheit hatten bitte teilen Sie mit mir. Dies funktioniert gut

:

 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 enthält die folgenden ein:

<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> 

Aber es produziert Source in Ausgabe und nimmt SOAP-Umschlag in Anfrage

aktualisiert.

Ich brauche das sollte Arbeit sein.

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

Antrag enthält

<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> 

Aber es hängt, während der Ausgang produziert und nach sehr langer Zeit, die die oben genannten Fehler erzeugen.

Ist der Unterschied zwischen den Anforderungen das Problem oder etwas anderes?

Antwort

6

denke ich, die Daten Web-Service-Client zurückgibt enthalten unzulässige Zeichen 0x1a die EOF ist.
XML lässt CONTROL CHAR nicht zu. Da nutzt du letztendlich XML.

Siehe ähnliches Problem: illegal character in xml document

Lösung:
1. Entweder Sie CONTROL-char
2. Oder Encode es in Web-Service beseitigen können und es bei SOAP-Client entschlüsseln.

+0

Danke für die Antwort können Sie bitte mein Update 1 gibt es ein Problem im Unterschied zwischen Anfrage? – subodh

+0

@subodh Meinst du, wenn Anfrage anders ist, erhältst du SOAP-Nachricht von Web-Service? – jaxb

+0

Nochmals vielen Dank für die schnelle Antwort, wenn ich den Anfragetyp Formular 1 zu zweiten Anfragetyp ändern, dann wird es den gleichen Fehler produzieren und dann auch die Ausgabe erzeugen. – subodh

Verwandte Themen