как обрабатывать исключения в мыльном веб-сервисе на основе ejb 3 - PullRequest
1 голос
/ 31 января 2011

В настоящее время я занимаюсь разработкой веб-службы SOAP на основе EJB3, и мне интересно, каковы наилучшие методы обработки неотслеживаемых исключений и возврата клиенту хорошо отформатированного ответа SOAP.

пример:

@WebMethod
public SomeResponse processSomeService(
        @WebParam(name = "someParameters") SomeParameters someParameters)
{
     // the EJB do something with the parameters
     // and retrieve a response fot the client
     SomeResponse theResponse = this.doSomething(someParameters);

     return theResponse;
}

Должен ли я поймать общее исключение, например:

@WebMethod
public SomeResponse processSomeService(
        @WebParam(name = "someParameters") SomeParameters someParameters)
{
     // the EJB do something with the parameters
     // and retrieve a response to return to the client
     try
     {
         SomeResponse theResponse = this.doSomething(someParameters);
     }
     catch (Exception ex)
     {
         // log the exception
         logger.log(Level.SEVERE, "something is going wrong {0}", ex.getMessage());
         // get a generic error response not to let the
         // technical reason going to the client
         SomeResponse theResponse = SomeResponse.createError();
     }

     return theResponse;
}

Существует ли какая-то "лучшая практика" для достижения этой цели?

Спасибо

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Не рекомендуется возвращать ошибку в ответе, SOAP определяет ошибку SOAP для обработки возврата ошибок. Как отметил Майкл Конецка, контейнер может обработать выброшенное исключение и преобразовать его в ошибку SOAP.

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

1 голос
/ 31 января 2011

Если вы хотите вернуть сообщение SOAP в случае ошибки, вам придется его создать.Я не ожидал бы, что контейнер будет знать, что вам нужно.

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

0 голосов
/ 31 января 2011

Не нужно их ловить, ejb-контейнер справится с этим.

ОБНОВЛЕНИЕ относительно комментария # 1 от Александра GUIDET

Из спецификации EJB 3.1, Глава 14.2.2 Обработка исключений -> Системное исключение:

  • Если метод бина встречает системное исключение или ошибка, это должно просто распространять ошибку от метод bean к контейнеру (т.е. метод бобов не должен поймать исключение).

  • Если метод бина выполняет операция, которая приводит к проверке исключение, что метод бина не может восстановить, метод бин должен бросить javax.ejb.EJBException, который переносит оригинальное исключение.

  • Любые другие непредвиденные ошибки следует сообщать с использованием javax.ejb.EJBException.

Таким образом, распространение RuntimeException на контейнер является способом, который рекомендует спецификация EJB.

...