Разница между WebApplicationException и WebServiceException в контексте Jax-RS (Джерси) - PullRequest
14 голосов
/ 01 ноября 2011

Я создаю веб-сервис на Джерси и обнаружил, что использую оба упомянутых типа исключений.Конструктор WebServiceException позволяет передавать String как причину, по которой WebApplicationException позволяет передавать код состояния HTTP. Включая различия в конструкторах, для чего нужны эти два типа исключений?

Спасибо.

1 Ответ

22 голосов
/ 01 ноября 2011

WebApplicationException - это способ, с помощью которого вы можете остановить выполнение ресурса REST и отправить некоторую значимую информацию своему клиенту.Для вещей, которые я делал, я подклассифицировал это исключение, чтобы оно имело реализацию, которая выдает JSON в виде сообщений об ошибках клиенту.В случае возникновения ошибки, скажем, отсутствующий файл, я мог бы сделать что-то вроде этого:

}catch(FileNotFoundException ex){
    throw new MyException(ex.getMessage());

На клиенте это тогда выдает что-то вроде:

{ errorCode: 56, errorMessage: 'could not find file "input.txt"' };

http://download.oracle.com/javaee/6/api/javax/ws/rs/WebApplicationException.html'

Исключение WebServiceException является корневым исключением времени выполнения для Джерси, т. Е. Его чаще всего возникает в результате сбоя ресурсов и в результате получается HTTP 500.

http://download.oracle.com/javaee/5/api/javax/xml/ws/WebServiceException.html

Таким образом, краткий ответ - первое исключение, которое вы можете выбросить, а другое, которое, как вы надеетесь, никогда не будет выброшено.: P

Пример:

public class MyException extends WebApplicationException {

public MyException(JSONObject jsonObject) {
    super(Response.status(Response.Status.OK)
            .entity(jsonObject)
            .type(MediaType.APPLICATION_JSON)
            .build());
}

Затем из любого места в вашем коде вы хотите остановить выполнение и отправить клиенту информацию об ошибке:

}catch(FileNotFoundException ex){
    throw new MyException(new JSONObject(){{ this.put("errorCode", 4); .... }});
...