Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-940

adding operations to wsdls make old clients fail

    XMLWordPrintableJSON

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.0
    • Fix Version/s: 2.0.3
    • Component/s: Service Model
    • Labels:
      None

      Description

      Using the old client code generated by wsdl2java to call a webservice which has been extended to support a new operation leads to an exception at runtime:

      javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException: No method was found for the WSDL operation

      {http://order.rbp.tmobile.at/services/rbpModifyContract/}

      rbpNewOperationWithExistingDatatypes.
      at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:240)
      at javax.xml.ws.Service.getPort(Service.java:94)
      at at.tmobile.rbp.order.services.rbpmodifycontract.RbpModifyContractService.getRbpModifyContract(RbpModifyContractService.java:51)
      at RbpModifyContractOperationsImplTestBase.testStandardCall(RbpModifyContractOperationsImplTestBase.java:87)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at junit.framework.TestCase.runTest(TestCase.java:164)
      at junit.framework.TestCase.runBare(TestCase.java:130)
      at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:69)
      at junit.framework.TestResult$1.protect(TestResult.java:110)
      at junit.framework.TestResult.runProtected(TestResult.java:128)
      at junit.framework.TestResult.run(TestResult.java:113)
      at junit.framework.TestCase.run(TestCase.java:120)
      at junit.framework.TestSuite.runTest(TestSuite.java:228)
      at junit.framework.TestSuite.run(TestSuite.java:223)
      at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
      at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
      Caused by: org.apache.cxf.service.factory.ServiceConstructionException: No method was found for the WSDL operation

      {http://order.rbp.tmobile.at/services/rbpModifyContract/}

      rbpNewOperationWithExistingDatatypes.
      at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeWSDLOperations(ReflectionServiceFactoryBean.java:300)
      at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.initializeWSDLOperations(JaxWsServiceFactoryBean.java:196)
      at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:195)
      at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:246)
      at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:136)
      at org.apache.cxf.frontend.AbstractEndpointFactory.createEndpoint(AbstractEndpointFactory.java:83)
      at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:50)
      at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:82)
      at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:320)
      at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:238)
      ... 23 more

      I had a look into ReflectionServiceFactoryBean.java (specifically initializeWSDLOperations()) where the exception is thrown
      https://svn.apache.org/repos/asf/incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java

      Seems like the model build from the new wsdl is compared to the old wsdl2java-generated interface file. If there are any operation not found in the java interface an exception is thrown.

      To support backward compatibility and loose coupling between web service providers and clients, it would be better to ignore methods not mentioned in the java interface file instead, as they can not be called via the interface anyway.

        Attachments

          Activity

            People

            • Assignee:
              dkulp Daniel Kulp
              Reporter:
              pc Christian Pfeifhofer
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: