jersey - 以编程方式调用 Jersey ResourceMethod
问题描述
我需要在每个 ResourceMethod 调用之前/之后拦截 Jersey 资源调用并运行代码。我有一个 ModelProcessor 并且能够拦截呼叫:
for(Resource resource: resourceModel.getResources()) {
for (ResourceMethod resourceMethod : resource.getResourceMethods()) {
Resource.Builder resourceBuilder = Resource.builder(...);
resourceBuilder
.addMethod(resourceMethod)
.handledBy(new Inflector<ContainerRequestContext, Response>() {
@Override
public Response apply(ContainerRequestContext containerRequestContext) {
...
}
});
}
}
但是,我不知道如何在这里调用原始的 ResourceMethod。
解决方案
您可以考虑使用 Jersey 过滤器或拦截器。从文档: https ://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/filters-and-interceptors.html#d0e9368
过滤器和拦截器可以在客户端和服务器端使用。过滤器可以修改入站和出站请求和响应,包括修改标头、实体和其他请求/响应参数。拦截器主要用于修改实体输入和输出流。例如,您可以使用拦截器来压缩和解压缩输出和输入实体流。
拦截器为服务器端和客户端共享一个公共 API。过滤器主要用于操纵请求和响应参数,如 HTTP 标头、URI 和/或 HTTP 方法,而拦截器旨在通过操纵实体输入/输出流来操纵实体。例如,如果您需要对客户端请求的实体主体进行编码,那么您可以实现一个拦截器来为您完成工作。
所以我认为你想使用拦截器,因为它们会包装资源调用,并且你可以在资源调用之前和资源调用之后访问相同的方法。
您也可以使用过滤器,但您必须将代码分解为 RequestFilter 和 ResponseFilter。
推荐阅读
- search - 如何在 Meteor 中创建仅返回允许数据的部分搜索
- c++ - 使用基于字符串的整数查找 PI 编号
- javascript - 更新状态而不导致重新渲染
- php - Authorization methods only works for default guard in Laravel
- haskell - Haskell:将 Int 转换为长度为 n 的字符串
- vba - 将 Outlook.Items 对象限制为带有附件的电子邮件
- c++ - 如何在 QT 中捕获“没有应用程序注册为处理此文件”?
- codeigniter - 如何处理指向我的服务器的 CNAME 记录
- python - Python Dataframe 遍历行(比较它们之间的值)并准备一个组作为输出
- node.js - mongodb、mongoose、express、nodejs 使用旧值更新多个文档中的字符串