简体   繁体   中英

JAX-RPC, Spring web services, and UnsupportedOperationCallException

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 :

  1. If I set the wsdlDocumentUrl property, 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.
  2. If I specify a PortInterface property (with a value of CompanyWebServiceInterfacePort ), 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:

  1. For a JAX-RPC service, do I need to set the PortInterface property? Is this the path I should be going down?
  2. Similiarly, does Spring need me to set the wsdlDocumentUrl property? 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.URL for the wsdlDocumentUrl property, had to set it with a path like file:///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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM