Jersey:在后台调用另一个API实现

时间:2017-09-26 12:04:21

标签: java proxy jersey jax-rs

我有一个包含三个实现的jax-rs API(让我们称之为mocklegacynew)。现在我想要的是创建某种代理功能,随后可以使用:

  • 让我们考虑其中的两个masterslave实现。
  • 此代理将拦截对master实现的调用,该代理将异步调用slave实现。
  • 无论slave的结果如何,对原始调用的回复始终来自master实施。
  • slave的结果永远不会延迟(或受影响)响应(因此是异步点)。

我的想法是以某种方式劫持球衣的调度过程(理想情况下,Invocable对象和请求参数已经可用,然后使用jersey's extension Proxy client来调用另一个API。问题是我我不知道球衣的内部结构如此之好,所以我不知道如何创造这样的功能。但是,这仍然是可能的,例如球衣的ConfiguredValidator具有方法{{我需要的参数'。 1}}。

总结一些伪代码,该功能(作为某种类型的请求过滤器)可以做到这一点:

validateResourceAndInputParams

知道如何创建和注册此类功能吗?

1 个答案:

答案 0 :(得分:2)

1)如果您正在寻找,则Jersey服务器为FilterInterceptor提供支持。您可以将您的异步调用生成到slave来拦截请求,并像往常一样调用master流。这些过滤器可用于插入日志记录/自定义身份验证以及许多此类需求。

ContainerResponseFilter(例如,你需要这个来定制回复)和[ContainerRequestFilter][2]

调用不同网址的示例是

@Provider
@PreMatching
public class RedirectFilter implements ContainerRequestFilter {

  @Override
  public void filter(ContainerRequestContext reqContext) throws IOException {

      // redirect conditionally
      if (shouldRedirect(reqContext)) {
          reqContext.setRequestUri(URI.create("/slave"));
      }
  }

  private boolean shouldRedirect(ContainerRequestContext reqContext) {
      //todo it should be conditional return
      return true;
  }
}

然后你的资源:

@Path("/")
public class MasterSlaveResource {

  @GET
  @Path("/master")
  public String getResponse() {
      return "master response";
  }

  @GET
  @Path("/slave")
  public String getTempResponse() {
      return "slave response";
  }
}

当然,这会向奴隶或主人发送请求,但我相信你可以调整它。

2)如果他们不满足您的要求,您可以访问资源中的HttpServletRequest本身,并且可以发送/委派/发送它

@Context final HttpServletRequest request,