写在前面:本帖可能是全网说的最细,最容易跟着调通的,因为在写这篇文章前,我看了很多篇百度搜出来的帖子,那些帖子要么前面说理论,后面给代码,但是代码又不全,没有办法直接根据帖子调通服务,也有直接贴代码说思路的,但是依我看代码并不干练简洁,也可能近1、2年SpringMVC invoker方式远程调用比较冷门了没人再关注这个技术,但是我打算整理一份比较通俗且全且偏实战的帖子来。
服务端:
1.编写TestRemoteService(很简单的一个interface类)
public interface TestRemoteService{
public String getUserInfo();
}
2.编写TestRemoteService接口实现类:TestRemoteServiceImpl
public class TestRemoteServiceImpl implements TestRemoteService {
@Override
public String getUserInfo() {
return “succ”;
}
}
3.在SpringMVC配置文件中增加如下配置:
<!-- SpringMVC远程调用服务 服务端配置 开始-->
<bean id="testRemoteServiceImpl" class="*.*.*.TestRemoteServiceImpl"/>
<bean id="testRemoteService" name="/testRemoteService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="testRemoteServiceImpl"></property>
<property name="serviceInterface" value="com.xiao2.remote.service.TestRemoteService">
</property>
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/testRemoteService">testRemoteService</prop>
</props>
</property>
</bean>
<!-- SpringMVC远程调用服务 服务端配置 结束-->
4.这里强烈建议跑起来服务端,测试TestRemoteService类是否正常工作,主要是为了在服务调用端调用远程服务报错时,排除不是服务端的异常。
服务调用端:
5.在SpringMVC配置文件中进行如下配置:
<!-- SpringMVC远程调用服务 客户端配置 开始 -->
<bean id="testRemoteService" name="testRemoteService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl">
<!--这里的value值为:http://IP:端口/服务端SpringMVC配置文件中配置的prop结点中的key值-->
<value>http://localhost:8080/testRemoteService</value>
</property>
<property name="serviceInterface">
<!--这里的value值为,从服务端项目复制到服务调用端项目的TestRemoteService类路径;
要注意的是,要实现SpringMVC invoker方式的远程服务调用,一定要复制服务端的TestRemoteService接口类到服务调用端来,而且一定要保证TestRemoteService类在服务端、服务调用端两个项目里的包路径完全一致,否则会报错;
其次和TestRemoteService类相关的bean类也要从服务端复制到服务调用端,同时也一定要保证复制到服务调用端的bean和服务端的bean包路径一定要完全一致,否则会报错-->
<value>*.*.*.*.TestRemoteService</value>
</property>
</bean>
<!-- SpringMVC远程调用服务 客户端配置 结束 -->
6.这一步是很重要的一步,在服务调用端编写Controller去调用远程服务,我直接上代码:
@Controller
@RequestMapping("/api")
public class TestController {
/**
* 这里不得不提的一点是,在这个地方使用@Autowired注解是不行的,
* 可是不使用@Autowired注解的话testRemoteService被声明后是null,无法调用远程服务,
* 这个时候需要手动去加载配置在服务调用端SpringMVC配置文件中的远程调用bean
*
* 在百度找了很多帖子看,这些帖子都有一个比较统一的写法:
* ApplicationContext context =new ClassPathXmlApplicationContext("*/*/SpringMVC配置文件名字");
* TestRemoteService testRemoteService=(TestRemoteService)context.getBean("testRemoteService");
*
* 通过以上两行代码可以达到@Autowired注解的效果,但是觉得有些繁琐,
* 我推荐手写一个setTestRemoteService方法来达到@Autowired注解的效果,
* 代码参见本类中setTestRemoteService方法即可。
*/
private TestRemoteService testRemoteService;
public void setTestRemoteService(TestRemoteService testRemoteService) {
this.testRemoteService = testRemoteService;
}
@ResponseBody
@RequestMapping("/test.do")
public String Test() {
return testRemoteService.getUserInfo();//在这里调用远程服务
}
}