我有一个JAX-RPC Web服务,我正在尝试使用Spring进行调用。这是我第一次使用Spring调用Web服务,所以现在我只是试图将其作为测试与JAX-RPC Web服务集成。
网络服务中有几十个操作,但现在我只关心其中一个。这里是我在Spring/客户端端创建的接口:
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);
}
这是我的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>
使用JaxRpcPortProxyFactoryBean
的这个配置,调用服务会返回以下异常:
org.springframework.remoting.RemoteProxyFailureException:无效的JAX-RPC调用配置;嵌套异常是操作样式:“rpc”不受支持
我从未完全理解 RPC 和文档式 web 服务之间的区别;然而,我相信这个 web 服务正在使用 RPC 风格 - 所以这个异常让我感到困惑。
第二,我困惑于应该在JaxRpcPortProxyFactoryBean
中设置哪些属性:
- 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. - If I specify a
PortInterface
property (with a value ofCompanyWebServiceInterfacePort
), then I get a different Exception stating:无法初始化JAX-RPC端口的服务[{http://www.company.com/wdsl} CompanyWebServiceInterfacePort]; 嵌套异常是WSDL数据缺失,此操作不可用。
换句话说,它告诉我WSDL丢失了 - 由于Spring不会使用用户名/密码从服务器获取它,我无法设置它!
我不确定这是否有任何意义,但本质上我不确定的是:
- 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
wsdlDocumentUrl
property? If so, is there any way I can tell Spring which WSDL and get around the authentication problem?