项目平台中用到一个通讯接口,与其他各个应用实现数据传输(用的WEBSERVICE),传输没问题,但是各个应用属于不同的厂商开发,相互之间没有联系。用的不同的技术发布的WEBSERVICE服务,有的用cxf,用的用axis;有的用xfire,有的是.net,PHp等还有的暂时不清楚,而且由于有的系统运行时间较长(有一定年头了)有些代码已经无法改变,只能通过区分名字或类型等标识位的方式来区分,并将各个WSDL服务生成各自相应的java客户端(平台是用JAVA),然后
if(application.type=cxf)
  使用CXF生成的客户端,并调用,几行代码得到返回值
else if(application.type=axis)
  使用axis生成的客户端,并调用,几行代码得到返回值
else if(application.type=xfire)
   使用xfire生成的客户端,并调用,几行代码得到返回值
.....等等,如果再出现不同类型而上述类型均无法适用的只能在生成客户端,写IF判断,俗称“开口子”
能不能通过一种特定的动态搭建SOAP请求的方式统一下(平台用的CXF),以后不管用什么发布的服务,当然了方法名,参数,服务名等等这些肯定是不能变的。都可以做到无需修改代码、例如:
WSDL wsdl=new WSDL(url);
setServiceName(wsdl....getServiceName());
setPortName(wsdl....getPortName());
setNameSpace(wsdl....getNameSpace());
类似以上形式。谢谢
 

解决方案 »

  1.   

    楼主试试这个调用各个服务端。
    javax.xml.rpc.Service;
    javax.xml.rpc.Call;
      

  2.   

    cxf的客户端是JDK自带的,应该也可以。private static final QName SERVICE_NAME = new QName("http://ws.ems.onlan.com", "ServiceSkeleton");
        private static final QName PORT_NAME = new QName("http://ws.ems.onlan.com", "ServiceSkeletonPort");
        
        public static void main(String[] args) {
            Service service = Service.create(SERVICE_NAME);
            String endpointAddress = "http://localhost:8080/ems/services/Service";
            service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
            WSprovider hw = service.getPort(WSprovider.class);        System.out.println(hw.testWS("vwefwef"));
          
            
          
        }
      

  3.   


    public static void main(String[] args) throws Exception {
    QName serviceName = new QName(
    "http://test.api.webservice.com", "TestService");
    QName portName = new QName("http://test.api.webservice.com",
    "TestServiceSoap"); Service service = Service.create(serviceName);
    String endpointAddress = "http://localhost/TestService/TestService.asmx";
    service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING,
    endpointAddress);
    TestServiceSoap soap= service.getPort(portName, TestServiceSoap.class); System.out.println(soap.syncOrganizations(new ArrayList<String>(), "A")
    .getString().size());
    }
    以上报
    信息: Problem initializing MSV validation
    java.lang.NoSuchMethodError: org.codehaus.stax2.validation.XMLValidationSchemaFactory.<init>(Ljava/lang/String;)V
    at com.ctc.wstx.msv.BaseSchemaFactory.<init>(BaseSchemaFactory.java:48)
    at org.apache.cxf.wstx_msv_validation.W3CMultiSchemaFactory.<init>(W3CMultiSchemaFactory.java:52)
    at org.apache.cxf.wstx_msv_validation.Stax2ValidationUtils.<init>(Stax2ValidationUtils.java:54)
    at org.apache.cxf.wstx_msv_validation.WoodstoxValidationImpl.<init>(WoodstoxValidationImpl.java:50)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
    at org.apache.cxf.bus.extension.Extension.load(Extension.java:105)
    at org.apache.cxf.bus.extension.ExtensionManagerImpl.loadAndRegister(ExtensionManagerImpl.java:183)
    at org.apache.cxf.bus.extension.ExtensionManagerImpl.processExtension(ExtensionManagerImpl.java:158)
    at org.apache.cxf.bus.extension.ExtensionManagerImpl.loadFragment(ExtensionManagerImpl.java:151)
    at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:143)
    at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:96)
    at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:129)
    at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:41)
    at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:37)
    at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:33)
    at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:90)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:137)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:122)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:89)
    at javax.xml.ws.Service.<init>(Service.java:35)
    at javax.xml.ws.Service.create(Service.java:126)
    at com.essp.webservice.api.Test.main(Test.java:19)
    2011-11-2 16:16:48 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass网上找了半天没找到相应的包
      

  4.   

    况且各个实现接口例如:TestServiceSoap 调用前我是不知道的
    我把这部分做成了一个补丁包,并采用配置文件的形式,各个接口统一调用我的一个核心服务接口,具体实现的类由各个项目的补丁包去实现。因为各个项目有不同的实现,方式,名称都不一样,已经比较完美的解决了我想到的问题呵呵,项目实施人员也说比较灵活了。补丁包他们可以改