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

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

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這個特性。標註如下:

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。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章