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

Dim*_*ima 14 rest spring resteasy resttemplate

我们使用Spring来实现REST控制器,例如:

@Controller
@RequestMapping("/myservice") 
public class MyController {
    @RequestMapping(value = "foo", method = RequestMethod.GET)
    public @ResponseBody string foo() {...}
}
Run Code Online (Sandbox Code Playgroud)

我可以使用spring RestTemplate调用此服务,它工作正常,但我更喜欢使用代理调用它,而不是使用字符串url调用无类型调用:

// client code:
MyController proxy = getProxy("baseUrl", MyController.class);
String results = proxy.foo();
Run Code Online (Sandbox Code Playgroud)

因此代理生成的输入是带有描述REST细节的注释的java接口.我读了这篇文章,看起来所有类型的远程调用都有代理,而我需要的REST就是这样RestProxyFactoryBean,我需要使用我的REST java接口并返回使用RestTemplate作为实现的类型安全代理.

我找到的最接近的解决方案是JBoss RESTEasy.

但它似乎使用了不同的注释集,因此我不确定它是否适用于我已有的注释:@Controller,@RequestMapping.还有其他选择,还是RESTEasy是唯一的选择?请注意,我是春天的新手,所以一些明显的春天的东西对我来说都是新的.

谢谢.
迪马

Bas*_*igt 1

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

理论上,代理使得函数调用对其用户来说是远程透明的,因此他们可以像本地函数调用一样使用该函数。

然而在实践中,这个承诺无法实现,因为远程函数调用除了本地调用之外还具有其他属性。网络中断、拥塞、超时、负载问题等等。如果您选择忽略所有这些远程调用可能出错的事情,您的代码可能不会很稳定。

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

  • 您对代理调用的远程性质的担忧可以通过附加参数来解决,例如超时、重试计数、网络错误处理程序、远程方法的命名。我正在尝试解决客户端和服务器之间简单而愚蠢的不匹配问题(经常发生),并使用编译器的功能来捕获我的拼写错误。 (3认同)