【问题标题】:Remove invalid characters from soap response in JAX-WS从 JAX-WS 中的肥皂响应中删除无效字符
【发布时间】:2016-05-10 15:02:25
【问题描述】:

我正在尝试使用 SP 网络服务获取共享点站点上的列表。

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

但是,由于肥皂响应中存在一些无效字符,我收到此错误。

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

我尝试修改 SOAPMessage 以从响应中删除无效字符。

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

但我在

遇到了一个例外
 SOAPMessage message = smc.getMessage();

堆栈跟踪是:

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)

请帮助我解决我的错误以及是否有其他方法可以从 SOAP 响应中删除无效字符。

谢谢!

【问题讨论】:

  • 更好的做法是修复服务提供者,使其符合 XML/SOAP 规范。你能在soapUI中调用服务吗?
  • 是的,我可以在 SoapUI 中调用该服务。 XML 响应包含此字符 这会导致代码跳闸。
  • (U+0015) 是 XML 1.0 中的无效字符。见Valid characters in XML。
  • 我正在尝试在我的代码中处理此问题并删除/替换 xml 响应中的无效字符

标签: java web-services soap jax-ws


【解决方案1】:

一种选择是实现您自己的SAAJMetaFactory,这将创建自定义MessageFactory。像这样:

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

根据SAAJMetaFactory#getInstance() 文档,您的 OwnSAAJMetaFactoryImpl 可以通过系统属性公开

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

或任何这种方式

  • 使用 javax.xml.soap.MetaFactory 系统属性。
  • 使用 JRE 目录中的属性文件“lib/jaxm.properties”。此配置文件采用标准 java.util.Properties 格式,并且 包含实现类的完全限定名称 key 是上面定义的系统属性。
  • 如果可用,请使用服务 API(如 JAR 规范中所述)来确定类名。服务 API 将寻找 文件 META-INF/services/javax.xml.soap.MetaFactory 中的类名 在运行时可用的 jar 中。
  • 默认为 com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2017-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多