JAX-RS客户端:ResponseProcessingException处理

Puc*_*uce 21 java jax-rs jersey java-ee java-ee-7

一些重载的调用请求方法,例如:get()和post(Entity<?> entity)(还有其他)SyncInvoker返回一个Response对象,而不是解组的内容.

我注意到,在get()没有文档的情况下ResponseProcessingException,而其他方法,如所有3个重载 post方法,可能会抛出一个ResponseProcessingException.

我知道这ResponseProcessingException是RuntimeException继承自的ProcessingException,但我仍然会解释这意味着该get()方法不会抛出ResponseProcessingException.

它是否正确?怎么样ClientResponseFilter?为什么比其他的呼叫请求方法(行为不同的行为put,post......)?

另外,Javadoc用于抛出的方法ResponseProcessingException说:

在接收到的HTTP响应的处理失败的情况下(例如,在过滤器中或在将响应实体数据转换为特定Java类型的实例期间).

那个部分:

或者在将响应实体数据转换为特定Java类型的实例期间

在这里似乎是错误的,因为该readEntity方法不应该被调用:

https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e9915

这是复制和粘贴文档错误吗?

不过,我猜过滤器是一个有效的案例.

Sam*_*Sam 1

文档肯定不一致。很明显,它ResponseProcessingException是在失败时抛出的ClientResponseFilter。

我正在研究的实现(RESTEasy 3.0.16)是这样做的:

try {
    filter.filter(requestContext, responseContext);
} catch (ResponseProcessingException e) {
    throw e;
} catch (Throwable e) {
    throw new ResponseProcessingException(response, e);
}
Run Code Online (Sandbox Code Playgroud)

当和方法声明异常时,该方法没有理由get不声明异常。在内部,它们都由相同的代码处理。putpost

我的结论是,这些方法之间的文档中的细微差别只是一个疏忽。

有趣的是,在我的源代码副本中,该get()方法的 javadoc 中有这一行:

/**
 * @throws javax.ws.rs.ProcessingException
 *          in case the invocation processing has failed.
Run Code Online (Sandbox Code Playgroud)

虽然所有其他类似的方法(例如get(Class<T>))的记录如下:

/**
 * @throws ProcessingException         in case the request processing or subsequent I/O operation fails.
Run Code Online (Sandbox Code Playgroud)

引起我注意的是第一个中的完全限定类名称。只是一种预感,但这让我觉得它是在不同的时间或由不同的人放入的。也许我分析过度了。我试图查看修订历史记录,但我发现的只是一个单一的提交,其中写着“将源代码移至其自己的存储库”)。就这么多了。

然而,正如您所指出的,这不是一个错误,因为ResponseProcessingException它是 的子类,ProcessingException而且甚至不是一个受检查的异常。