在升级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还是带有之前生成的配置。