Invalid UTF-8 middle byte 0x0 (at char #0, byte #-1)

在升級WebLogic從11g到12c的過程當中,在進行遠程Web Service方法調用的過程當中會遇到以下的錯誤信息:java

oracle.j2ee.ws.client.jaxws.JRFSOAPFaultException: Client received SOAP Fault from server : javax.xml.soap.SOAPException: Error parsing envelope: most likely due to an invalid SOAP message.: Invalid UTF-8 middle byte 0x0 (at char #0, byte #-1)
        at oracle.j2ee.ws.client.jaxws.DispatchImpl.throwJAXWSSoapFaultException(DispatchImpl.java:1757)
        at oracle.j2ee.ws.client.jaxws.DispatchImpl.invoke(DispatchImpl.java:1344)
        at oracle.j2ee.ws.client.jaxws.OracleDispatchImpl.synchronousInvocationWithRetry(OracleDispatchImpl.java:237)
        at oracle.j2ee.ws.client.jaxws.OracleDispatchImpl.invoke(OracleDispatchImpl.java:108)
        at oracle.j2ee.ws.client.jaxws.WsClientProxyInvocationHandler.invoke(WsClientProxyInvocationHandler.java:264)

究其緣由是由於在12c中,經過wsa.jar工具來組裝Web Service時,會自動生成一個wsm-policy.xml的文件,裏面定義了一系列默認的policy,包括一個叫fast_infoset_service_policy的policy,根據release feature,這個功能會對消息進行一些壓縮等優化處理,提升效率。既然這一技術仍然不是很成熟,會影響到如今的功能,我就打算把他禁止掉。參考weblogic的文檔http://docs.oracle.com/middleware/1212/wls/WSGET/jax-ws-fastinfoset.htm#WSGET3427,有三種方式來使fast_infoset失效,我的推薦第一種:直接在定義Web Service的時候添加annotation來標註server不採用fast_infoset,否則的話須要在client端也enable這個特性。標註以下:web

import com.oracle.webservices.api.FastInfosetService;
                                                                                                                                                                     
@WebService(name="HelloWorldPortType", serviceName="HelloWorldService")
@FastInfosetService(enabled = false)
                                                                                                                                                                     
public class HelloWorldImpl {}

驗證的方式能夠經過查看從web端獲取的wsdl文件,若是文件頭裏沒有fastinfoset字樣的配置則說明已經成功disable了這一功能。另外經過EM或者WLST方式來disable fast infoset的方式詳見連接,特別須要注意的是經過這兩種方式,首先要修改weblogic domain,在模塊中添加wsm manager,這樣才能順利找到database,成功commitWSMSession。
api

另外還有須要注意的一點,經過wsa工具生成wsm-policy文件的時候必定要清空導出的目錄,否則新的policy配置會append到舊的文件裏,這樣即便你在代碼中已經disable了fast_infoset,最後server仍是帶有以前生成的配置。
oracle

相關文章
相關標籤/搜索