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

相关文章
相关标签/搜索