我们使用Spring来实现REST控制器,例如:
@Controller
@RequestMapping("/myservice")
public class MyController {
@RequestMapping(value = "foo", method = RequestMethod.GET)
public @ResponseBody string foo() {...}
}
我可以使用spring RestTemplate调用此服务,它工作正常,但我更喜欢使用代理调用它,而不是使用字符串url调用无类型调用:
// client code:
MyController proxy = getProxy("baseUrl", MyController.class);
String results = proxy.foo();
因此代理生成的输入是带有描述REST细节的注释的java接口。我读了this article,看起来所有类型的远程调用都有代理,而我所需要的REST就像RestProxyFactoryBean
,它将采用我的REST java接口并返回使用RestTemplate作为实现的类型安全代理。
我找到的最接近的解决方案是JBoss RESTEasy。
但它似乎使用了不同的注释集,因此我不确定它是否适用于我已有的注释:@Controller
,@RequestMapping
。还有其他选择,还是RESTEasy是唯一的选择?请注意,我是春天的新手,所以一些明显的春天的东西对我来说都是新鲜的。
谢谢。 迪马
你可以试试Netflix的Feign,这是一个基于代理的轻量级REST客户端。它通过注释以声明方式工作,Spring Cloud项目使用它与Netflix Eureka进行交互。
发明REST范例的原因之一是因为对其他远程技术(RMI,CORBA,SOAP)的熟练程度向我们表明,基于代理的方法通常会产生比它解决的问题更多的问题。
从理论上讲,代理使得函数调用对用户来说是远程透明的,因此它们可以使用与本地函数调用完全相同的函数。
但实际上,这个承诺无法实现,因为远程函数调用只具有本地调用之外的其他属性。网络中断,拥塞,超时,负载问题仅举几例。如果您选择忽略所有远程调用可能出错的事情,您的代码可能不会非常稳定。
TL; DR:您可能不应该使用代理,它不再是最先进的技术。只需使用RestTemplate
。
这是一个试图从控制器注释生成运行时代理的项目(在后台使用RestTemplate来处理代理调用):spring-rest-proxy-client虽然在实现的早期阶段。
这似乎是这样做的:https://swagger.io/swagger-codegen/,并且swagger还有许多其他REST API的好东西。
看看https://github.com/ggeorgovassilis/spring-rest-invoker。您只需要注册FactoryBean:
@Configuration
public class MyConfiguration {
@Bean
SpringRestInvokerProxyFactoryBean BankService() {
SpringRestInvokerProxyFactoryBean proxyFactory = new SpringRestInvokerProxyFactoryBean();
proxyFactory.setBaseUrl("http://localhost/bankservice");
proxyFactory.setRemoteServiceInterfaceClass(BankService.class);
return proxyFactory;
}
然后你可以自动装配接口类:
@Autowired
BookService bookService;