一、简介:HTTP invoker是一个新的远程调用模型,作为Spring框架的一部分,能够执行基于HTTP的远程调用,并使用Java的序列化机制。
二、服务端代码:
public interface RMIService {
List<Map<String,Object>> queryAllUser();
}
@Service
public class RMIServiceImpl implements RMIService{
@Autowired
private UserDao userDao;
@Override
public List<Map<String, Object>> queryAllUser() {
return userDao.getUsers();
}
}
将服务导出为一个Bean
@Bean
public HttpInvokerServiceExporter httpInvokerServiceExporter(RMIService rmiService) {
HttpInvokerServiceExporter httpInvokerServiceExporter = new HttpInvokerServiceExporter();
httpInvokerServiceExporter.setService(rmiService);
httpInvokerServiceExporter.setServiceInterface(RMIService.class);
return httpInvokerServiceExporter;
}
因为 HttpInvokerServiceExporter 是一个Spring MVC 控制器,需要建立一个URL处理器,映射 HTTP URL 到对应的服务上
@Bean
public HandlerMapping httpInvokerMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
Properties mappings = new Properties();
mappings.setProperty("/spitter.service", "httpInvokerServiceExporter");
mapping.setMappings(mappings);
return mapping;
}
/**
* 初始化servlet WebApplicationContext 相关
* 扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类会自动的配置
* DispatcherServlet和Spring应用上下文
* 会同时创建 DispatcherServlet 和 ContextLoaderListener。
* @author fmr
*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
/**
* 返回带有@Configuration注解的类将会用来配置ContextLoaderListener
* 创建的应用上下文中的类
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{AppConfig.class};
}
/**
* 加载配置文件或者配置类中所声明的bean
* 返回带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文中的类
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{DispatcherConfig.class};
}
/**
* 将一个或者多个路径映射到DispatcherServlet上
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/","*.service"};
}
/**
* 添加过滤器
* @return
*/
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[]{characterEncodingFilter};
}
}
三、客户端代码:
public interface RMIService {
List<Map<String,Object>> queryAllUser();
}
@Bean
public HttpInvokerProxyFactoryBean rmiService() {
HttpInvokerProxyFactoryBean proxy = new HttpInvokerProxyFactoryBean();
proxy.setServiceUrl("http://localhost:8080/SpringProject/spitter.service");
proxy.setServiceInterface(RMIService.class);
return proxy;
}
@Autowired
private RMIService rmiService;
@RequestMapping("testRmi")
public String testRmi() {
List<Map<String,Object>> maps = rmiService.queryAllUser();
String result = maps.get(0).get("username").toString();
return result;
}
四、总结:
HTTP invoker 有一个重大的限制:它只是一个Spring框架所提供的远程调用解决方案,这意味着客户端和服务端必须都是Spring应用;这也隐含表明客户端和服务端必须都是基于Java的。