我有一个试图使用 Spring 使用的 JAX-RPC Web 服务。这是我第一次使用 Spring 来使用 Web 服务,所以现在我只是想让它与 JAX-RPC Web 服务集成作为测试。
Web 服务中有几十个操作,但现在我只关心一个。以下是我在 Spring/client 端创建的接口:
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
:
- 如果我设置了该
wsdlDocumentUrl
属性,我最终会收到 HTTP 401 错误,因为此 Web 服务位于 HTTP 基本身份验证之后,并且似乎 Spring 在获取 WSDL 时不使用用户名/密码属性。 - 如果我指定一个
PortInterface
属性(值为CompanyWebServiceInterfacePort
),那么我会得到一个不同的异常说明:无法为 JAX-RPC 端口初始化服务 [{ http://www.company.com/wdsl }CompanyWebServiceInterfacePort]; 嵌套异常是 WSDL 数据丢失,此操作不可用
换句话说,它告诉我缺少 WSDL——我无法设置它,因为 Spring 不会使用用户名/密码从服务器获取它!
我不确定这是否有任何意义,但本质上我不确定的是:
- 对于 JAX-RPC 服务,是否需要设置 PortInterface 属性?这是我应该走的路吗?
- 同样,Spring需要我设置
wsdlDocumentUrl
属性吗?如果是这样,有什么方法可以告诉 Spring 哪个 WSDL 并解决身份验证问题?