首页 > 解决方案 > REST 组件的类似 EJB 的通信

问题描述

我正在设计具有不同组件的软件,这些组件需要通过 REST 接口相互通信。

我已经看到并实现了解决方案,其中软件的不同组件(部署在同一个集群上)将通过声明和注入 EJB bean 进行通信。这样,通过在单独的 .jar 依赖项中定义通用接口和 DTO 来标准化通信真的很容易。

这种舒适度和标准化水平是我希望通过 RESTful 服务在我的软件的基于 Java 的组件之间实现的。

想象一下这样的事情:

比方说,我有一个REST Client(C)和一个REST Server(S)。我希望能够通过一个通用接口在它们之间进行通信,该接口SC. 这个通用接口在API component(I) 中。

这意味着I会有一个接口:

@RestController
@RequestMapping("/rest/user")
public class UserController {

    @GetMapping("list")
    ResponseEntity<List<UsersModel>> getUserList(OAuth2LoginAuthenticationToken token);
}

C可以像这样使用:

public class Sg {

    private final UserController userController;

    ...

    public void method(OAuth2LoginAuthenticationToken token) {
        ...
        userController.getUserList(token);
        ...
    }
}

最后,在S

public class UserControllerImpl implements UserController {
    @Override
    public ResponseEntity<List<UsersModel>> getUserList(OAuth2LoginAuthenticationToken token) {
        ...
    }
}

唯一需要的配置是告诉客户端服务器的上下文根(和主机地址),其他一切都以注释的形式存在于公共接口中。

由于并非所有组件都必须基于 Java,因此以典型的类似 REST 的方式调用 REST 资源很重要,因此这些 Java 远程服务调用机制不在考虑之列。

我正在研究 JAX-RS,它看起来很有希望,但缺少一些很好的功能。例如,没有一个通用接口告诉客户端可以在服务器上的哪个端点找到 REST 资源,也没有方法名称等。AFAIK,在客户端上,您只能调用代表 HTTP 方法的方法请求,这是一个无赖。

我对这个规范失去了理智吗?我还没有真正体验过 REST 服务,所以我真的不知道我说的是不是 REST 服务范围之外的东西。我面临的问题是否已经存在解决方案?

标签: javarest

解决方案


经过更深入的研究,我发现RESTeasy已经有了解决方案。

您需要使用ProxyBuilder来创建界面的代理,仅此而已。


推荐阅读