我们已经使用 Springs HttpInvoker 几个星期了,它就像一个魅力。从我的前端(网络)应用程序我连接到后端的 userService,如下所示:
<bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://${backend.host}/backend-ws/remoting/UserService"/>
<property name="serviceInterface" value="com...service.UserService"/>
</bean>
然后将 UserService 很好地注入到我们的前端类中。
现在我们将其部署在适当的 (WAS7) 服务器上,并且要求使用 SSL (https)。因此,我将(serviceUrl 的)http 更改为 https,但随后我得到:
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [https://pbp-dev.dev.echonet/public/backend-ws/remoting/ParameterHelper]; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
这是有道理的,因为安装在服务器(WAS 运行的地方)上的证书没有由 CA 签名。
我们已经有了一些经验,因为在同一个 WAS 上运行了一个 web 服务;为此,我们使用 cxf 并生成了一个 jks 文件(使用 keytool),该文件位于客户端应用程序中,设置如下:
<http:conduit name="https://serverurl/.*">
<http:tlsClientParameters secureSocketProtocol="SSL" disableCNCheck="false">
<sec:trustManagers>
<sec:keyStore type="jks" password="pass123" resource="trust.jks"/>
</sec:trustManagers>
</http:tlsClientParameters>
我想对于 Http Invoker,我们需要做一些类似的事情,但我们不知道如何在调用者中使用这个 trust.jks。
我确实发现的一件事是使用不同的 requestExecutor;像这样:
<bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="https://${backend.host}/backend-ws/remoting/UserService"/>
<property name="serviceInterface" value="com...service.UserService"/>
<property name="httpInvokerRequestExecutor">
<bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor" />
</property>
</bean>
在此之后,我不再收到证书错误,但从那以后似乎没有创建 userService:
NoSuchBeanDefinitionException: No matching bean of type [com...service.UserService] found for dependency