SpringMVC invoker方式实现远程服务调用

写在前面:本帖可能是全网说的最细,最容易跟着调通的,因为在写这篇文章前,我看了很多篇百度搜出来的帖子,那些帖子要么前面说理论,后面给代码,但是代码又不全,没有办法直接根据帖子调通服务,也有直接贴代码说思路的,但是依我看代码并不干练简洁,也可能近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();//在这里调用远程服务

	}
}
发布了87 篇原创文章 · 获赞 22 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/gaofenglxx/article/details/97128044
今日推荐