Лучший способ обработки исключений в приложении с веб-сервисами - PullRequest
5 голосов
/ 07 марта 2012

У меня есть приложение, которое состоит из веб-сервисов SOAP и REST и простого HTTP-доступа.Все они конвертируют входящие запросы и отправляют их обработчику.Самое болезненное - это обработка исключений.Чтобы вернуть правильный ответ, я должен обернуть каждый метод блоком try-catch и создать там ответ.

Я думал, что смогу создать фильтр, который мог бы это сделать.Но как фильтр может распознать его источник (мыло, внешний интерфейс), чтобы я знал, что должен вернуть SOAP или другой ответ?

Ответы [ 4 ]

7 голосов
/ 07 марта 2012

Это зависит от используемой вами среды WS. Все, что я знаю, имеет какие-то перехватчики / аспекты, которые вы можете вводить и обрабатывать исключения в одном месте. Например, в есть даже специальная исходящая цепочка ошибок , где вы можете подключить свои собственные перехватчики.

Очевидно, try-catch в каждом методе - плохая идея.

4 голосов
/ 07 марта 2012

В слое ниже Web-Service Layer вы должны создать свой собственный Exception, а в Web-Service layer вы должны использовать try-catch подход для достижения occurred exception и в catch блоке log и преобразовать его к вашему исключению уровня пользовательского веб-сервиса. Я показываю этот подход в следующем:

@WebService
public class EmployeeWS
{
    @WebMethod
    public void add(Employee em) throws CustomWebServiceException
    {
       try
       {
         // call facade layer method  
       }
       catch(Exception e)
       {
          logger.error(e.getMessage());
          throw new CustomWebServiceException(e);
       }        
    }
}

Альтернативно, используя try catch в любом Web-Method, вы можете использовать AOP подход (для образца Spring AOP) или interceptor подход в Web-Service frameworks (для образца SOAPHandler<T> в JAX-WS).

Примечание : В JAX-WS стандарте вы не можете throw a RuntimeException, потому что Exception должен указывать в окончательном WSDL, а если вы throw a RuntimeException ваш клиент веб-сервиса не достигает вашего CustomException, в другом ваш Web-Method должен бросить в себя подпись.

Для получения дополнительной информации вы можете просмотреть выбранные Web-Service документы по фейерверку.

1 голос
/ 07 марта 2012

Похоже, вы не используете какой-либо фреймворк, потому что это были типичные фреймворки.Например, Spring позволяет вам отделить код от обработки исключений и определить ваши собственные обработчики исключений.

В вашем случае, как правило, у вас есть 2 решения.

(1) Вы можете использовать шаблон Decorator: оберните каждую службу декоратором, где каждый метод реализован как

try {
    call real method
} catch() {
   send error to client
}

Так как это очень многословно, вы можете сэкономить время, используя динамический прокси (функция, которая была представлена ​​в Java 5).Таким образом, вы можете динамически переносить каждый сервис (если ваши сервисы имеют определенный интерфейс).

(2) Вы можете решить эту проблему, используя страницу ошибки API сервлета:

javax.servlet.ServletException / servlet / ErrorDisplay

для получения дополнительной информации см. http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3/

0 голосов
/ 10 октября 2013

Вы можете настроить свой класс! Сделай это!

Полагайте на диагностические ошибки, такие как вставка номера протокола, журнала сообщений, клиента сообщений и т. Д. *

http://java.globinch.com/enterprise-java/web-services/jax-ws/jax-ws-exceptions-faults-annotation-exception-and-fault-handling-examples/#Pre-Requisites

...