如何为Spring实现的RESTful服务生成Java客户端代理?

时间:2013-05-12 21:23:41

标签: spring rest resteasy resttemplate

我们使用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是唯一的选择? 请注意,我是春天的新手,所以一些明显的春天的东西对我来说很新鲜。

谢谢。
迪马

5 个答案:

答案 0 :(得分:3)

您可以通过Netflix(一种基于轻量级代理的REST客户端)尝试Feign。它通过注释以声明方式工作,并且Spring Cloud项目使用它与Netflix Eureka进行交互。

答案 1 :(得分:2)

发明REST范例的原因之一是因为其他远程技术(RMI,CORBA,SOAP)的经验表明,基于代理的方法经常会产生比解决方案更多的问题。

理论上,代理使得函数调用对其用户是远程透明的,因此它们可以使用与本地函数调用完全相同的函数。

但实际上,这个承诺无法实现,因为远程函数调用只具有本地调用之外的其他属性。网络中断,拥塞,超时,负载问题仅举几例。如果您选择忽略远程调用可能出错的所有这些问题,那么您的代码可能不会非常稳定。

TL; DR:您可能不应该使用代理,它不再是最先进的。只需使用RestTemplate

答案 2 :(得分:1)

这是一个尝试从控制器注释生成运行时代理的项目(在后台使用RestTemplate来处理代理调用):spring-rest-proxy-client虽然很早就实现了。

答案 3 :(得分:1)

这似乎是这样做的:https://swagger.io/swagger-codegen/,并且swagger还有很多其他REST API的好东西。

答案 4 :(得分:0)

Have a look at https://github.com/ggeorgovassilis/spring-rest-invoker. All you need is to register FactoryBean:

@Configuration
public class MyConfiguration {

    @Bean
    SpringRestInvokerProxyFactoryBean BankService() {
        SpringRestInvokerProxyFactoryBean proxyFactory = new SpringRestInvokerProxyFactoryBean();
        proxyFactory.setBaseUrl("http://localhost/bankservice");
        proxyFactory.setRemoteServiceInterfaceClass(BankService.class);
        return proxyFactory;
    }

and after that you can autowire the interface class:

@Autowired
BookService bookService;