I have a JAX-RPC web service that I am attempting to consume using Spring. This is my first time using Spring to consume a web service, so right now I’m just trying to get it to integrate with the JAX-RPC web service as a test.
The web service has several dozen operations in it, but for right now I only care about one. Here are the interfaces I’ve created on the Spring/client side:
public interface WSClient { public boolean userExists(int userid); } public interface WSService { //this method matches the method signature of the Web Service public com.company.data.User getUser(int userid); }
And here is my applicationContext.xml:
<bean id='WSClient' class='com.company.ws.test.WSClientImpl'> <property name='service' ref='myWebService'></property> </bean> <bean id='myWebService' class='org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean'> <property name='serviceInterface' value='com.company.ws.test.WSService'/> <property name='endpointAddress' value='http://1.2.3.4/web-service/data'/> <property name='namespaceUri' value='http://www.company.com/wdsl'/> <property name='serviceName' value='CompanyWebService'/> <property name='username' value='username'/> <property name='password' value='password'/> <property name='maintainSession' value='true'/> </bean>
Using this configuration of JaxRpcPortProxyFactoryBean, invoking the Service returns the following exception:
org.springframework.remoting.RemoteProxyFailureException: Invalid JAX-RPC call configuration; nested exception is operation style: ‘rpc’ not supported
I’ve never fully understood the difference between RPC and document-style web services; however, I believe this web service is using RPC-style – so this exception confuses me.
Second, I’m confused on which properties I should be setting with JaxRpcPortProxyFactoryBean:
- If I set the
wsdlDocumentUrlproperty, I end up getting a HTTP 401 error as this web service sits behind HTTP Basic Authentication, and it seems Spring does not use the username/password properties when fetching the WSDL. - If I specify a
PortInterfaceproperty (with a value ofCompanyWebServiceInterfacePort), then I get a different Exception stating:
Failed to initialize service for JAX-RPC port [{http://www.company.com/wdsl}CompanyWebServiceInterfacePort]; nested exception is WSDL data missing, this operation is not available
In other words, it’s telling me that the WSDL is missing – which I can’t set since Spring won’t use the username/password to fetch it from the server!
I’m not sure if any of this makes any sense, but in essence what I’m unsure of is:
- For a JAX-RPC service, do I need to set the PortInterface property? Is this the path I should be going down?
- Similiarly, does Spring need me to set the
wsdlDocumentUrlproperty? If so, is there any way I can tell Spring which WSDL and get around the authentication problem?
I eventually solved this by saving a copy of the WSDL file locally, and, since JaxRpcPortProxyFactoryBean expects a
java.net.URLfor thewsdlDocumentUrlproperty, had to set it with a path likefile:///c:/.../blah.wsdl.This isn’t really all that desireable, I would hate to have to put a
file:///URI in a Spring context file that might be deployed on a server, especially on a different platform – seems odd that this class behaves this way.I’m guessing most people aren’t using Spring aren’t using JAX-RPC anyway.