WebApplicationException与Response

时间:2012-11-13 10:49:45

标签: java rest jersey jax-rs

REST 服务中向客户端返回响应的所有可能性中,我看到两种看似相同的可能性:抛出WebApplicationException(可能使用{{1}实例)或返回Response实例。

为什么使用一种可能性而不是另一种可能性,因为结果相同?这与使用的 REST 框架有关,可以配置为在异常和常规响应之间做出不同反应吗?

1 个答案:

答案 0 :(得分:27)

  

为什么使用一种可能性而不是另一种,因为结果相同?

也许是因为作为一个(Java)程序员,你习惯于在应用程序的特定规则被破坏时抛出异常?将一些字符串转换为数字,你可能得到一个NumberFormatException,在数组中使用错误的索引,你得到一个ArrayIndexOutOfBoundsException,访问你不允许的内容并获得SecurityException等当无法创建“常规响应”时(无论是输入错误还是处理错误),您习惯于抛出异常。

如果无法返回常规响应,则必须向客户端返回错误响应。您可以通过抛出异常或手动构建响应来实现此目的。这对您的客户来说是一回事,但对于您的服务器端代码来说却不是一回事。

抛出异常会使您的代码更清晰,更容易推理,从而更容易理解。我们的想法是继承WebApplicationException并从中创建您自己的有意义的例外(例如ProductNotFoundException extends WebApplicationException { ... }AccessDeniedException extends WebApplicationException { ... }或重复使用exception mapper的例外情况)。

throw new ProductNotFoundException()throw new AccessDeniedException()更清晰,让框架处理它而不是每次构建Response,然后按照用于构建它的细节来弄清楚这段代码中发生了什么。