在开发webservice的过程中,如果使用tomcat作为单机发布测试,会发现非常容易。比较典型的开发框架:
1.axis。axis有1.x和2.x版本。如果碰巧你的服务端开发商使用1.x版本,噩梦就开始了。你在社区无法获取1.x的全部支持。
2.cxf。以前的xfire整合了好多东西,包括jaxp。cxf生成的客户端代码不支持rpc。
3.jaxp。以前版本为1.x时,使用xrpcc生成客户端代码。2.x以后,使用jaxws/bin/wsimport生成代码。不过这个命令不支持rpc,如果还需要支持rpc,则必须使用jaxrpc/bin/wscompile生成代码。
jaxp生成rpc支持的客户端示例:
1.axis。axis有1.x和2.x版本。如果碰巧你的服务端开发商使用1.x版本,噩梦就开始了。你在社区无法获取1.x的全部支持。
2.cxf。以前的xfire整合了好多东西,包括jaxp。cxf生成的客户端代码不支持rpc。
3.jaxp。以前版本为1.x时,使用xrpcc生成客户端代码。2.x以后,使用jaxws/bin/wsimport生成代码。不过这个命令不支持rpc,如果还需要支持rpc,则必须使用jaxrpc/bin/wscompile生成代码。
jaxp生成rpc支持的客户端示例:
- 编写config.xml文件。如下。
- 使用命令:wscompile -gen:client -keep config.xml
以上任何框架生成的webservice代码,在tomcat里面运行正常。但是如果移植到weblogic,麻烦就来了。
- <configuration
- xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
- <wsdl
- location="http://localhost:8080/services/my.wsdl"
- packageName="com.mycom.webservice.my" />
- </configuration>
weblogic使用了自己的webservice实现。在运行过程中,由于其webservice实现时考虑了向低版本兼容策略,在服务层又没有进行很好的设计规避新版本和旧版本的问题,其结果直接导致以上框架生成的webservice客户端无法使用。
解决方案是:
- 设置系统变量。
- System.setProperty("javax.xml.parsers.SAXParserFactory","org.apache.xerces.jaxp.SAXParserFactoryImpl");
- 设置系统变量有时候不好使,视乎代码初始化设置的时间和冲突应用(如果有的话。没有冲突应用则以上设置就能起作用)的初始化设置时间。
- 部署为ear。ear可以设置系统变量,该变量在本系统运行周期起作用。以下是一个META-INF/weblogic-application.xml的例子。
- <?xml version="1.0" encoding="UTF-8"?>
- <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
- <xml>
- <parser-factory>
- <saxparser-factory>
- org.apache.xerces.jaxp.SAXParserFactoryImpl
- </saxparser-factory>
- <document-builder-factory>
- org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
- </document-builder-factory>
- <transformer-factory>
- org.apache.xalan.processor.TransformerFactoryImpl
- </transformer-factory>
- </parser-factory>
- </xml>
- <application-param>
- <param-name>webapp.encoding.default</param-name>
- <param-value>UTF-8</param-value>
- </application-param>
- <prefer-application-packages>
- <package-name>javax.jws.*</package-name>
- <package-name>org.apache.xerces.*</package-name>
- <package-name>org.apache.xalan.*</package-name>
- </prefer-application-packages>
- </weblogic-application>
- 如果使用jaxp的rpc方式生成webservice客户端,有可能会报下面的错误。这时可能需要检查是否使用了jdk6来生成客户端。如果是,请下载最新的saaj或者换jdk5.
- java.lang.ClassCastException: com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl cannot be cast to com.sun.xml.messaging.saaj.soap.MessageImpl
- 如果使用jaxp的rpc方式生成webservice客户端,有可能会报下面的错误。
这时,可能需要在代码中设置系统变量。
- java.lang.ClassCastException: weblogic.webservice.core.soap.SOAPMessageImpl
或者使用ear并在weblogic-application.xml来设置系统变量。
- System.setProperty("javax.xml.soap.MessageFactory","com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
- System.setProperty("javax.xml.soap.SOAPConnectionFactory","weblogic.wsee.saaj.SOAPConnectionFactoryImpl");