2010-09-03 2 views
1

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

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

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

Или, есть ли конфигурация в Axis2, которая говорит, что не отображает stacktrace в неисправности?

Спасибо!

ответ

-1

Вы можете не только поймать AxisFault

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

Куда я положу этот код? Ошибка распространяется из сгенерированного класса MessageReceiverInOut, где у меня есть этот код catch: ** ...} catch (java.lang.Exception e) {throw org.apache.axis2.AxisFault.makeFault (e); ... ** – userOfAxis2

+0

Вы, должно быть, используете класс MessageReceiverInOut? –

+0

org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver использует это. Класс * MessageReceiverInOut автоматически создается средством codegen из моего wsdl-файла. Кажется хрупким взломать его и добавить в него мои вещи. – userOfAxis2

1

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

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

Наличие элемента stacktrace в деталях является поведением по умолчанию, но есть способы указать ваши пользовательские детали. Одним из способов является использование поля 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); 
    } 
} 

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

0

Axis2 использует Apache Commons Logging и 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); 
} 

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

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

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

Смежные вопросы