Как исключить трассировку стека из реакции на ошибку axis2 - PullRequest
1 голос
/ 03 сентября 2010

У меня есть веб-сервис Axis2, который выдает различные подробные сообщения в ответ на ошибку при возникновении проблем с сигналом в вызове.

В какой-то момент из-за ошибок сервера (кроме тех, которые были обработаны веб-службой), в строке сведений о сбое я получаю полную трассировку стека того, что произошло.Я не хочу, чтобы клиент видел трассировку стека, поэтому (в качестве перехвата всех ошибок) я хочу вывести простое сообщение «Ошибка сервера» без трассировки стека, ничего.

Что является самым простым способомперехват ошибок и изменение сообщения об ошибке.Являются ли модули единственным способом (сложным) сделать это?

Или в Axis2 есть конфигурация, которая не показывает трассировку стека при ошибке?

Спасибо!

Ответы [ 3 ]

1 голос
/ 10 сентября 2010

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

Я сам предоставил Axis2 подробности ошибки.Сервлет Axis2 имеет метод с именем handleFault, который занимается генерацией ошибки.Точнее (глубже в вызове) метод MessageContextBuilder.createFaultEnvelope используется для создания элемента ошибки.

Наличие трассировки стека в деталях является поведением по умолчанию, но есть способы указать ваши пользовательские детали.Одним из способов является использование поля AxisFault detail, в которое можно добавить OMElement (см. AXIOM ) для помещения в ошибку.Таким образом, вы делаете что-то вроде:

public class MyServlet extends AxisServlet {
  ...
  public void handleFault(MessageContext msgContext, OutputStream out, AxisFault e) {
    OMFactory factory = OMAbstractFactory.getOMFactory();
    OMElement detail = factory.createElement(...);
    e.setDetail(detail);
    // now let axis do its thing with the new improved AxisFault
    super.handleFault(msgContext, out, e);
  }
}

Теперь вместо трассировки стека исключений будет добавлена ​​ваша деталь.

0 голосов
/ 17 сентября 2010

Axis2 использует протокол регистрации общих Apache, и сообщения AxisFault, которые вы видите, генерируются кодом в Axis2, который выглядит примерно так:

try {
    executeMethod(httpClient, msgContext, url, getMethod);
    handleResponse(msgContext, getMethod);
} catch (IOException e) {
    log.info("Unable to sendViaGet to url[" + url + "]", e);
    throw AxisFault.makeFault(e);
} finally {
    cleanup(msgContext, getMethod);
}

[Этот сегмент кода приходитfrom org.apache.axis2.transport.http.HTTPSender]

Так что обратитесь к apache commons logging user manual для получения инструкций о том, как установить уровни ведения журнала и место назначения сообщений.

Надеюсь, это поможет.

0 голосов
/ 03 сентября 2010

Можете ли вы не просто поймать AxisFault

try {
    // do stuff
} catch (AxisFault f) {
    log.error("Encountered error doing stuff", f);
    throw new IOException("Server error");
}
...