You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Andrius Sakalauskas <an...@bsprendimai.lt> on 2007/11/15 22:00:10 UTC

JAVA CXF AND Rails SOAP

Hello to all,

I'm trying to make rails and java-spring app talk to each other
but with no luck...
 From rails side: Rails posts the argument to java (correctly I think) 
but java response is icorrect!
 From java side: When trying to deploy war file I get error though cxf 
configuration should be correct because I get what I expected when 
calling getHello from java service.
Maybe some of you with greater experience in the field could help me out?
Is there something wrong with my wsdl files?

Java app startup error:
2007-11-15 22:22:02,896 ERROR 
[org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/calculator]] 
- Exception sending context initialized event to listener instance of 
class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'client' defined in ServletContext resource 
[/WEB-INF/webServiceContext.xml]: Instantiation of bean failed; nested 
exception is 
org.springframework.beans.factory.BeanDefinitionStoreException: Factory 
method [public java.lang.Object 
org.apache.cxf.frontend.ClientProxyFactoryBean.create()] threw 
exception; nested exception is 
org.apache.cxf.service.factory.ServiceConstructionException: Could not 
find definition for service 
{http://service.calculator.bsprendimai.lt/}IHelloService.
Caused by: 
org.springframework.beans.factory.BeanDefinitionStoreException: Factory 
method [public java.lang.Object 
org.apache.cxf.frontend.ClientProxyFactoryBean.create()] threw 
exception; nested exception is 
org.apache.cxf.service.factory.ServiceConstructionException: Could not 
find definition for service 
{http://service.calculator.bsprendimai.lt/}IHelloService.
Caused by: org.apache.cxf.service.factory.ServiceConstructionException: 
Could not find definition for service 
{http://service.calculator.bsprendimai.lt/}IHelloService.
       at 
org.apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.java:114) 

       at 
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:208) 

       at 
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:270) 

       at 
org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:146) 

       at 
org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:89) 

       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:89) 

       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 
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:118) 

       at 
org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:332) 

       at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:778) 

       at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:705) 

       at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:386) 

       at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249) 

       at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155) 

       at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246) 

       at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160) 

       at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:291) 

       at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352) 

       at 
org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:245) 

       at 
org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:188) 

       at 
org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49) 

       at 
org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3729) 

       at 
org.apache.catalina.core.StandardContext.start(StandardContext.java:4187)
       at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759) 

       at 
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
       at 
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
       at 
org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:809)
       at 
org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:698)
       at 
org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:472)
       at 
org.apache.catalina.startup.HostConfig.check(HostConfig.java:1190)
       at 
org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:292)
       at 
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 

       at 
org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1305) 

       at 
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1569) 

       at 
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1578) 

       at 
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1558) 

       at java.lang.Thread.run(Thread.java:595)

Rails wire dump:

= Request

! CONNECT TO localhost:8080
! CONNECTION ESTABLISHED
POST /calculator/services/HelloServiceImpl HTTP/1.1
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
User-Agent: SOAP4R/1.5.5 (/187, ruby 1.8.6 (2007-06-07) [i486-linux])
Date: Thu, 15 Nov 2007 20:11:00 GMT
Content-Length: 404
Host: localhost:8080

<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <env:Body>
   <n1:getHello xmlns:n1="http://service.calculator.bsprendimai.lt/">
     <arg0>
       <arg0>Andrius</arg0>
     </arg0>
   </n1:getHello>
 </env:Body>
</env:Envelope>

= Response

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
SOAPAction: ""
Content-Type: text/xml;charset=utf-8
Content-Length: 249
Date: Thu, 15 Nov 2007 20:11:00 GMT

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:getHelloResponse 
xmlns:ns1="http://service.calculator.bsprendimai.lt/">
<return>Hello from java,
     </return>
</ns1:getHelloResponse>
</soap:Body>
</soap:Envelope>


--------------------- Rails code---------------------
require 'soap/wsdlDriver'
class HomeController < ApplicationController
         def index
               factory = 
SOAP::WSDLDriverFactory.new("http://localhost:8080/calculator/services/HelloServiceImpl?wsdl") 

         driver  = factory.create_rpc_driver
         driver.generate_explicit_type = true
         driver.wiredump_dev = STDOUT
         render(:text => driver.getHello(:arg0 => "Andrius"))
     end
end

--------------------- Rails wsdl---------------------

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="Webservice" xmlns:typens="urn:ActionWebService" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
targetNamespace="urn:ActionWebService" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns="http://schemas.xmlsoap.org/wsdl/">
 <message name="GetHello">
   <part name="param0" type="xsd:string"/>
 </message>
 <message name="GetHelloResponse">
   <part name="return" type="xsd:string"/>
 </message>
 <portType name="WebserviceWebservicePort">
   <operation name="GetHello">

     <input message="typens:GetHello"/>
     <output message="typens:GetHelloResponse"/>
   </operation>
 </portType>
 <binding name="WebserviceWebserviceBinding" 
type="typens:WebserviceWebservicePort">
   <soap:binding transport="http://schemas.xmlsoap.org/soap/http" 
style="rpc"/>
   <operation name="GetHello">
     <soap:operation soapAction="/webservice/api/GetHello"/>
     <input>

       <soap:body 
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
namespace="urn:ActionWebService" use="encoded"/>
     </input>
     <output>
       <soap:body 
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
namespace="urn:ActionWebService" use="encoded"/>
     </output>
   </operation>
 </binding>
 <service name="WebserviceService">
   <port name="WebserviceWebservicePort" 
binding="typens:WebserviceWebserviceBinding">

     <soap:address location="http://localhost:3000/webservice/api"/>
   </port>
 </service>
</definitions>

JAVA webservice config:
   <bean id="client" class="lt.bsprendimai.calculator.service.IHello" 
factory-bean="clientFactory" factory-method="create"/>
       <bean id="clientFactory" 
class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
      <property name="serviceClass" 
value="lt.bsprendimai.calculator.service.IHello"/>
      <property name="address" 
value="http://localhost:3000/webservice/api"/>
      <property name="wsdlURL" 
value="http://localhost:3000/webservice/service.wsdl"/>
    </bean>

--------------------- JAVA code ---------------------
IHello.java:
package lt.bsprendimai.calculator.service;

import javax.jws.*;
import javax.jws.soap.*;
import javax.jws.soap.SOAPBinding.*;

@WebService
@SOAPBinding(style=Style.RPC, use=Use.ENCODED)
public interface IHello {

    public String getHello(String username);
}

HelloServiceImpl.java:
package lt.bsprendimai.calculator.service;

import lt.bsprendimai.calculator.service.IHello;
import javax.jws.WebService;

@WebService(endpointInterface = "lt.bsprendimai.calculator.service.IHello")
public class HelloServiceImpl implements IHello {

    public String getHello(String username){

        return "Hello from java, "+username;
    }

}

--------------------- Java wsdl---------------------
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tns="http://service.calculator.bsprendimai.lt/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
name="HelloServiceImplService" 
targetNamespace="http://service.calculator.bsprendimai.lt/">
 <wsdl:message name="getHello">
   <wsdl:part name="arg0" type="xsd:string">
   </wsdl:part>
 </wsdl:message>
 <wsdl:message name="getHelloResponse">
   <wsdl:part name="return" type="xsd:string">
   </wsdl:part>
 </wsdl:message>
 <wsdl:portType name="IHello">
   <wsdl:operation name="getHello">
     <wsdl:input message="tns:getHello" name="getHello">
   </wsdl:input>
     <wsdl:output message="tns:getHelloResponse" name="getHelloResponse">
   </wsdl:output>
   </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="HelloServiceImplServiceSoapBinding" type="tns:IHello">
   <soap:binding style="rpc" 
transport="http://schemas.xmlsoap.org/soap/http"/>
   <wsdl:operation name="getHello">
     <soap:operation soapAction="" style="rpc"/>
     <wsdl:input name="getHello">
       <soap:body namespace="http://service.calculator.bsprendimai.lt/" 
use="literal"/>
     </wsdl:input>
     <wsdl:output name="getHelloResponse">
       <soap:body namespace="http://service.calculator.bsprendimai.lt/" 
use="literal"/>
     </wsdl:output>
   </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="HelloServiceImplService">
   <wsdl:port binding="tns:HelloServiceImplServiceSoapBinding" 
name="HelloServiceImplPort">
     <soap:address 
location="http://localhost:8080/calculator/services/HelloServiceImpl"/>
   </wsdl:port>
 </wsdl:service>
</wsdl:definitions>