一些背景故事:我正在建立旧(呃)系统的测试环境(2008)。系统目前处于工作状态,但我们需要在升级之前开始测试。有一个前端代理应用程序通过Spring(2.5.4)HTTP调用与后端应用程序进行交互。
我有源代码和Spring相关的依赖项,我可以通过源代码附带的构建脚本编译系统。我已经设置了一个本地虚拟机作为我的后端,并且应用程序在两侧的JBoss(4.2.2)上部署并运行。
我能够向代理运行Soap请求,身份验证正在运行,所以一切似乎都是正确的。
现在,当我尝试访问我的服务器服务时,通过HTTP调用的应用程序之间的通信不起作用。
这是我在服务器端的设置:
这会创建一个包含所有相关服务的bean
<bean id="onlineService" class="my.own.class.OnlineService">
<property name="orderService" ref="orderService" />
<property name="invalidateService" ref="invalidateService" />
<property name="checkStatusService" ref="checkStatusService" />
</bean>
使用http调用者公开服务
<bean name="onlineServiceHttp"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="onlineService" />
<property name="serviceInterface" value="my.own.interface.OnlineServiceI" />
</bean>
<bean id="simpleUrlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/onlineServiceHttp">onlineServiceHttp</prop>
</props>
</property>
</bean>
这是我的客户端设置:
<!-- Online Service using HTTP Invoker -->
<bean id="onlineservice"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl"
value="http://${ONLINE_SERVICES_HOST}:8080/vmosvcs/vmoservice/onlineServiceHttp" />
<property name="serviceInterface" value="my.own.interface.OnlineServiceI" />
</bean>
最后,在我的客户端(代理应用程序)上通过Soap创建我的bean目标
<bean id="orderMarshallEndpoint" class="my.proxy.endpoints.OrderMarshallEndpoint">
<property name="service" ref="onlineservice" />
</bean>
<bean id="invalidateMarshallEndpoint" class="my.proxy.endpoints.InvalidateMarshallEndpoint">
<property name="service" ref="onlineservice" />
</bean>
<bean id="checkStatusMarshallEndpoint" class="my.proxy.endpoints.CheckStatusMarshallEndpoint">
<property name="service" ref="onlineservice" />
</bean>
当我向例如checkStatusMarshallEndpoint发送Soap请求时,我在客户端上收到以下错误:
CustomAuthenticationManager 16 -----New Request in Proxy -----
CustomAuthenticationManager 17 Request sent by username :peter:
CustomAuthenticationManager 19 Authentication Result:true:
CheckStatusMarshallEndpoint 22 Check Status request received
OnlineEndpoint 52 The authenticated partnerId is :imran
CheckStatusMarshallEndpoint 27 The request is :: serial Number :null: activation Code :[PROTECTED]::imran
CustomSoapFaultMappingExceptionResolver 28 org.springframework.remoting.RemoteInvocationFailureException:
Invocation of method [public abstract RmiDataTransferObject OnlineServiceI.getServed(...,...)]
failed in HTTP invoker remote service at [http://{ONLINE_SERVICE_HOST}:8080/vmosvcs/vmoservice/onlineServiceHttp];
nested exception is java.lang.NoSuchMethodException: com.sun.proxy.$Proxy76.getServed(..., ...)
在这个地方
RmiDataTransferObject resp = service.getServed(getRequest(csr), OnlineServiceI.CHECK_STATUS_SERVICE);
其中RmiDataTransferObject getServed(...,...)是my.own.interface.OnlineServiceI的一部分。如果我调试执行,有一个JdkDynamicAopProxy声明正确的HTTP路径,但它没有注册方法。只有预期的界面。
我可能会缺少什么?如果我在浏览器中尝试HTTP URL,我会得到一个500,表示路径是正确的(某些东西映射到该地址)。