使用ContainerRequestContext#abortWith生成JSONP

时间:2018-05-07 14:33:00

标签: jersey jsonp jersey-2.0

我有这个基于Jersey2的应用程序,带有自定义ContainerRequestFilter

当调用filter(ContainerRequestContext)方法时,我想进行检查,如果需要,我希望能够在进入应用程序的主逻辑之前停止请求。 目前,我使用ContainerRequestContext#abortWith方法来阻止呼叫并返回错误"回应客户。

我的应用程序将JSONP返回给客户端,如果我阻止abortWith,则响应始终为JSON

看看我发现的球衣来源 负责org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor序列化的JSONP。 在abortWith流程中,我发现它无法找到JSONP注释,但我不知道它在哪里搜索。

我的方法有,实际上在"普通"方案(没有abortWith)我正确地看到了JSONP格式。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

ContainerRequestFilter#filter方法类似于

public void filter(final ContainerRequestContext crc) throws IOException {
    if (/* logic */) {
        CustomObject ret = new CustomObject();
        ret.error = "error message";
        crc.abortWith(Response.ok(ret)).build());
    }
}

JsonWithPaddingInterceptor期望带有JSONP注释的回复,以便我从ResourceInfo#resourceMethod检索它们,例如

public void filter(final ContainerRequestContext crc) throws IOException {
    if (/* logic */) {
        Annotation[] as = this.resourceInfo.getResourceMethod().getAnnotations();

        CustomObject ret = new CustomObject();
        ret.error = "error message";
        crc.abortWith(Response.ok().entity(ret, as).build());
    }
}

这样就可以正确找到注释