WebApplicationException vs Response

Среди всех возможностей вернуть ответ клиенту в службе REST я видел две возможности, которые выглядят эквивалентными: бросая WebApplicationException (возможно, используя экземпляр Response), или возвращает экземпляр Response.

Зачем использовать одну возможность над другой, так как результат тот же? Связано ли это с используемой структурой REST, которая может быть настроена так, чтобы реагировать по-разному между исключениями и регулярными ответами?

Ответы

Ответ 1

Зачем использовать одну возможность над другой, так как результат тот же?

Может быть, потому что в качестве (Java) программиста вы привыкли бросать исключения, когда нарушаются определенные правила приложения? Преобразуйте некоторую строку в число, и вы можете получить NumberFormatException, использовать неправильный индекс в массиве и получить ArrayIndexOutOfBoundsException, получить то, что вам не разрешено, и получить SecurityException и т.д. Вы привыкли бросать исключения, когда "регулярный ответ" не может быть создан (будь то неправильный ввод или некоторая ошибка обработки).

Если вы не можете вернуть регулярный ответ, вы должны вернуть ответ об ошибке клиенту. Вы можете сделать это, либо выбросив исключение, либо создав ответ вручную. Это то же самое для вашего клиента, но это не то же самое для вашего кода на стороне сервера.

Выбрасывание исключения делает ваш код более чистым, проще рассуждать и, следовательно, легче понять. Идея состоит в том, чтобы подклассифицировать WebApplicationException и создать из него свои собственные значимые исключения (например, ProductNotFoundException extends WebApplicationException { ... }, AccessDeniedException extends WebApplicationException { ... } или повторное использование исключений с aa сборщик исключений).

Затем он очистится до throw new ProductNotFoundException() или throw new AccessDeniedException(), и пусть структура обрабатывает его вместо создания Response каждый а затем следуйте деталям, используемым для его построения, чтобы выяснить, что происходит в этом разделе кода.