weblogic上的webservice

    在开发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. 编写config.xml文件。如下。
  2. 使用命令:wscompile -gen:client -keep  config.xml
  1. <configuration 
  2.     xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config"> 
  3.         <wsdl 
  4.     location="http://localhost:8080/services/my.wsdl" 
  5.     packageName="com.mycom.webservice.my" /> 
  6. configuration> 
以上任何框架生成的webservice代码,在tomcat里面运行正常。但是如果移植到weblogic,麻烦就来了。
weblogic使用了自己的webservice实现。在运行过程中,由于其webservice实现时考虑了向低版本兼容策略,在服务层又没有进行很好的设计规避新版本和旧版本的问题,其结果直接导致以上框架生成的webservice客户端无法使用。

解决方案是:
  1. 设置系统变量。
    1. System.setProperty("javax.xml.parsers.SAXParserFactory","org.apache.xerces.jaxp.SAXParserFactoryImpl");
  2. 设置系统变量有时候不好使,视乎代码初始化设置的时间和冲突应用(如果有的话。没有冲突应用则以上设置就能起作用)的初始化设置时间。
  3. 部署为ear。ear可以设置系统变量,该变量在本系统运行周期起作用。以下是一个META-INF/weblogic-application.xml的例子。
    1. xml version="1.0" encoding="UTF-8"?>
    2. <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
    3.     <xml>
    4.       <parser-factory>
    5.         <saxparser-factory>
    6.           org.apache.xerces.jaxp.SAXParserFactoryImpl
    7.         saxparser-factory>
    8.         <document-builder-factory>
    9.           org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
    10.         document-builder-factory>
    11.         <transformer-factory>
    12.           org.apache.xalan.processor.TransformerFactoryImpl
    13.         transformer-factory>
    14.       parser-factory>
    15.     xml>
    16.     <application-param>
    17.         <param-name>webapp.encoding.defaultparam-name>
    18.         <param-value>UTF-8param-value>
    19.     application-param>
    20.     <prefer-application-packages>
    21.         <package-name>javax.jws.*package-name>
    22.         <package-name>org.apache.xerces.*package-name>
    23.         <package-name>org.apache.xalan.*package-name>
    24.     prefer-application-packages>
    25. weblogic-application> 
  4. 如果使用jaxp的rpc方式生成webservice客户端,有可能会报下面的错误。这时可能需要检查是否使用了jdk6来生成客户端。如果是,请下载最新的saaj或者换jdk5.
    1. 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
  5. 如果使用jaxp的rpc方式生成webservice客户端,有可能会报下面的错误。
    1. java.lang.ClassCastException: weblogic.webservice.core.soap.SOAPMessageImpl
    这时,可能需要在代码中设置系统变量。
    1. System.setProperty("javax.xml.soap.MessageFactory","com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
    2. System.setProperty("javax.xml.soap.SOAPConnectionFactory","weblogic.wsee.saaj.SOAPConnectionFactoryImpl");

    或者使用ear并在weblogic-application.xml来设置系统变量。

你可能感兴趣的:(java)