Entfernen Sie ungültige Zeichen aus einer soap-Antwort, die in JAX-WS

Ich versuche die Listen auf einer sharepoint-Website mithilfe von SP-webservice.

Lists listsSevice = new Lists(new URL(spSiteURL + "/_vti_bin/Lists.asmx?wsdl"));
listsSevice.setHandlerResolver(new SPHandlerResolver());
spListsServiceIfx = listsSevice.getListsSoap();
//Calling the List Web Service
GetListItemsResponse.GetListItemsResult result = spListsServiceIfx .getListItems(listName, viewName, query, viewFields, rowLimit, queryOptions, webID);

Aber ich bekomme diese Fehlermeldung, da einige ungültige Zeichen vorhanden, die in einer soap-Antwort.

com.sun.xml.ws.encoding.soap.DeserializationException: Failed to read a response: javax.xml.bind.UnmarshalException
- with linked exception:
[com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x15 at [row,col {unknown-source}]: [1125,122]]

Habe ich versucht zu ändern, der SOAPMessage entfernen Sie ungültige Zeichen aus der Antwort.

public class SOAPMessageHandler implements SOAPHandler<SOAPMessageContext> {

public boolean handleMessage(SOAPMessageContext smc) {
    System.out.println("in handleMessage");
    Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    System.out.println("outboundProperty: " + outboundProperty);

    try {
        if (outboundProperty.booleanValue()) {
            System.out.println(" SOAP Request ");
        } else {
            System.out.println(" SOAP Response ");
            SOAPMessage message = smc.getMessage();
            message.writeTo(System.out);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            message.writeTo(out);
            String messageAsString = new String(out.toByteArray());
            /*smc.setMessage(new SOAPMessage( 
            stripNonValidXMLCharacters(message.getSOAPPart().toString())));*/
        }

    } catch (SOAPException e) {         
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("in soap msg handler..." + e.getMessage());
        e.printStackTrace();
    }
    System.out.println(""); 

    return true;
}

Aber ich bekomme eine exception auf

 SOAPMessage message = smc.getMessage();

Den stack trace:

javax.xml.ws.WebServiceException: javax.xml.soap.SOAPException: org.xml.sax.SAXParseException; lineNumber: 1125; columnNumber: 122; Illegal character entity: expansion character (code 0x15
at [row,col {unknown-source}]: [1125,122]
at com.sun.xml.ws.handler.SOAPMessageContextImpl.getMessage(SOAPMessageContextImpl.java:86)
at com.cah.ecm.sharepoint.migrator.util.SOAPMessageHandler.handleMessage(SOAPMessageHandler.java:25)
at com.cah.ecm.sharepoint.migrator.util.SOAPMessageHandler.handleMessage(SOAPMessageHandler.java:1)
at com.sun.xml.ws.handler.HandlerProcessor.callHandleMessageReverse(HandlerProcessor.java:341)
at com.sun.xml.ws.handler.HandlerProcessor.callHandlersResponse(HandlerProcessor.java:214)
at com.sun.xml.ws.handler.ClientSOAPHandlerTube.callHandlersOnResponse(ClientSOAPHandlerTube.java:163)
at com.sun.xml.ws.handler.HandlerTube.processResponse(HandlerTube.java:164)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:651)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:600)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:482)
at com.sun.xml.ws.client.Stub.process(Stub.java:323)
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:113)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)
at com.sun.proxy.$Proxy28.getListItems(Unknown Source)
at com.cah.ecm.sharepoint.migrator.sharepoint.client.SharepointClient.getListItemNodes(SharepointClient.java:292)
at com.cah.ecm.sharepoint.migrator.sharepoint.client.SharepointClient.getListItems(SharepointClient.java:389)
at com.cah.ecm.sp.jde.main.TestIterateAllSPFiles.main(TestIterateAllSPFiles.java:35)

Bitte helfen Sie mir mit, wo ich bin falsch und wenn es eine Alternative Methode zum entfernen von ungültigen Zeichen aus einer SOAP-Antwort.

Dank!

  • Eine bessere Vorgehensweise wäre, die fix-service-provider, so dass es im Einklang mit den XML – /SOAP-Spezifikation. Sind Sie in der Lage, den Dienst aufzurufen, in soapUI?
  • Ja, ich bin in der Lage, den Dienst aufzurufen, in SoapUI. Die XML-Antwort enthält das Zeichen &#21; wodurch der code auf die Reise.
  • &#21 (U+0015) ist ein ungültiges Zeichen in XML 1.0. Siehe zulässige Zeichen in XML.
  • Ich bin versucht zu behandeln, das in meinem code und entfernen/ersetzen der ungültigen Zeichen in der xml-Antwort
InformationsquelleAutor mak | 2016-05-10



One Reply
  1. 0

    Eine Möglichkeit ist die Umsetzung Ihrer eigenen SAAJMetaFactory zu entwerfen, das benutzerdefinierte MessageFactory. Wie diese:

    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.MimeHeaders;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPMessage;
    
    import com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl;
    
    public class OwnSAAJMetaFactoryImpl extends SAAJMetaFactoryImpl {
        @Override
        protected MessageFactory newMessageFactory(String protocol) throws SOAPException {
            final MessageFactory f = super.newMessageFactory(protocol);
            return new MessageFactory() {
    
                @Override
                public SOAPMessage createMessage(MimeHeaders headers, InputStream in) throws IOException, SOAPException {
                    in = doCleaingStuff(in);
                    return createMessage(headers, in);
                }
    
                @Override
                public SOAPMessage createMessage() throws SOAPException {
                    return f.createMessage();
                }
            };
        }
    
        private InputStream doCleaingStuff(InputStream in) {
            //TODO implement it
            return null;
        }
    }

    Laut SAAJMetaFactory#getInstance() Dokumentation Ihre OwnSAAJMetaFactoryImpl können ausgesetzt werden, durch die system property

    System.setProperty("javax.xml.soap.MetaFactory", "own.package.OwnSAAJMetaFactoryImpl");

    oder der Weg

    • Verwenden Sie die javax.xml.Seife.MetaFactory system-Eigenschaft.
    • Verwenden Sie die Eigenschaften der Datei „lib/jaxm.Eigenschaften“ im JRE-Verzeichnis. Diese Konfigurations-Datei wird im standard-java.util.Eigenschaften-format und
      enthält den vollständig qualifizierten Namen der Implementierungsklasse mit dem
      – Taste die system-Eigenschaft, die oben definiert werden.
    • Verwenden Sie das Services-API (wie detailliert in der JAR-Spezifikation), wenn verfügbar, um zu bestimmen, die classname. Die Services API suchen
      einem Klassennamen in der Datei META-INF/services/javax.xml.Seife.MetaFactory
      in Gläsern zur Verfügung, um die Laufzeit.
    • Standard-com.Sonne.xml.messaging.saaj.Seife.SAAJMetaFactoryImpl.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.