Как вернуть трассировку стека клиенту в MULE..?

Кто-нибудь знает, как распечатать полную трассировку стека в браузере, когда в MULE возникает исключение времени выполнения..??

Когда возникает исключение во время выполнения, MULE выдает клиенту ошибку сервера 500, но не показывает никаких подробностей клиенту. Он печатает всю трассировку стека в консоли или в файлах журнала (например, следующим образом):

Root Exception stack trace:
java.sql.SQLException: Invalid column name
    at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3677)
    at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2749)
    at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:494)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' 
    for everything)

Могу ли я показать ту же трассировку стека в браузере (клиенту)..??

И если возможно, то также подскажите, как включить или выключить печать Stack Trace в браузере..??

(Возможно, когда-нибудь в будущем я не захочу показывать трассировку стека в браузере)


person Ramandeep Singh    schedule 23.11.2011    source источник


Ответы (2)


Да, это возможно. Я предполагаю, что вы используете обычную конечную точку HTTP, и это служба типа REST (?). Если это так, вы можете просто поместить try/catch вокруг кода, вызывающего исключение, и вернуть любой текст, который вы хотите.

Существуют также стратегии исключений (http://www.mulesoft.org/documentation/display/MULE3USER/Error+Handling) для более сложной обработки ошибок, но похоже, что вы ищете простой ответ выше.

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

person awynne    schedule 23.11.2011
comment
Очевидно, я реализовал Try/Catch во всем своем проекте..!!..n я возвращаю исключение в любой форме, которую я хочу.. Но я спрашивал: предположим, вы поместили символ \ в URL-адрес, затем MULE вернет ошибка сервера 500 (очевидно, так и должно быть, потому что это исключение URI). Но могу ли я поймать и это исключение (где-то в файле mule_config)..?? - person Ramandeep Singh; 24.11.2011
comment
Означает ли это, что вы также пробовали стратегию исключения, и это не помогло? - person awynne; 11.12.2011
comment
да ... я пробовал стратегию пользовательского исключения, но класс, который он вызывает, может возвращать только Mule-Message , а не то, что я хочу. (StackTrace ИЛИ что-то другое, кроме этого)..!! - person Ramandeep Singh; 14.12.2011

В Mule нет ничего из коробки для этого. Вы должны реализовать обработчик исключений, который будет форматировать трассировку стека в полезной нагрузке исключения сообщения и возвращать ее вызывающей стороне.

В вашем случае транспорт HTTP имеет особенность, которую можно найти в коде HttpMessageReceiver:

try
{
    conn.writeResponse(processRequest(request));
}
catch (Exception e)
{
...
    conn.writeResponse(buildFailureResponse(request.getRequestLine().getHttpVersion(), httpStatus, e.getMessage()));

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

Я вижу два варианта решения вашей проблемы:

  • подкласс HttpMessageReceiver и сделать ответное сообщение настраиваемым в вашей версии,
  • отказаться от HTTP-транспорта в пользу Jetty (посмотрите пример с книжным магазином) и настроить сообщения об ошибках ответа на уровне веб-контейнера.
person David Dossot    schedule 23.11.2011
comment
Я никогда не выбрасываю исключение из своего класса JAVA. Каждое исключение во всех моих классах Java было перехвачено. Но что, если есть исключение, сгенерированное самим MULE, например исключение URL. (Я объяснил ситуацию в моем другом комментарии ниже.). Как я могу поймать это исключение..?? - person Ramandeep Singh; 24.11.2011