2016-05-10 17 views
2

SP webserviceを使用してSharepointサイトに存在するリストを取得しようとしています。JAX-WSのSOAP応答から無効な文字を削除します

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応答からの文字。

ありがとうございます!

+0

サービスプロバイダを修正して、XML/SOAP仕様に準拠するようにしてください。 soapUIでサービスを呼び出せますか? – rustyx

+0

はい、私はSoapUIでサービスを呼び出すことができます。 XML応答には、この文字が含まれているため、コードが移動します。 – mak

+0

&#21(U + 0015)はXML 1.0では無効な文字です。 [XMLの有効な文字](https://en.wikipedia.org/wiki/Valid_characters_in_XML)を参照してください。 – rustyx

答えて

0

1つの方法は、カスタムMessageFactoryを作成する独自のSAAJMetaFactoryを実装することです。このように:

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形式であり、 には、実装クラスの完全修飾名が含まれており、上記で定義したシステムプロパティーの キーが含まれています。
  • 可能であれば、サービスAPI(JAR仕様に詳述)を使用して、クラス名を決定します。サービスAPIは、実行時に使用できるjarファイルMETA-INF/services/javax.xml.soap.MetaFactory のクラス名を と検索します。
  • デフォルトはcom.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImplです。
関連する問題