RestTemplate — обрабатывать пользовательское сообщение об ошибке

У меня есть Restful API, который отвечает на ошибку 404, когда элемент не найден, но имеет разные сообщения в зависимости от причины, по которой элемент не найден (неизвестно, недоступен,...), это делается с помощью Spring MVC:

response.sendError(HttpServletResponse.SC_NOT_FOUND, "NOT_AVAILABLE");

(это прекрасно работает с любым браузером, отображая 404 ошибки с сообщением «NOT_AVAILABLE»)

Теперь я хотел бы вернуть это сообщение в свой код Java, используя Spring RestTemplate, чтобы управлять ими. Я пробовал это:

try {
    rest.put(apiRootUrl + "/item/{itemId}", null, itemId);
} catch (HttpClientErrorException e) {
    if (NOT_FOUND == e.getStatusCode()) {
        switch (MyErrorCode.valueOf(e.getStatusText())) {
            case NOT_AVAILABLE:
                return displayNotAvailableError();
            case UNKNOWN:
                return displayUnknownError();
            default:
                // ...
        }
    }
}

но в getStatusText() я всегда получал метку NOT FOUND (из 404), а не свое пользовательское значение.

Кто-нибудь знает, можно ли получить пользовательское сообщение из ошибок 404? И поэтому как?

большое спасибо!

Изменить: я работаю на сервере Tomcat (который отправляет HTML-страницу 404), и это не добавляется к серверу Weblogic.


person antoine    schedule 03.08.2012    source источник
comment
Я нашел обходной путь, проанализировав тело ответа следующим образом: errorBody.substring(errorBody.indexOf(‹u›)+3, errorBody.indexOf(‹/u›)); Но это не очень аккуратно... :-(   -  person antoine    schedule 03.08.2012
comment
Это происходит с сервером Tomcat, Weblogic делает это правильно, поэтому я думаю, что это связано с реализацией API сервлета tomcat.   -  person antoine    schedule 07.08.2012


Ответы (1)


Хорошо, если немного покопаться, решение на самом деле очень простое!

Tomcat отправлял мне свою страницу 404 по умолчанию, мне просто нужно было сказать ей, чтобы она использовала мою!

Как это сделать:

  • создайте страницу 404.jsp следующим образом:

    <%@ page pageEncoding="UTF-8" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <c:out value="${requestScope['javax.servlet.error.message']}"/>
    
  • укажите его в своем web.xml

    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    

И теперь вы можете получить сообщение в своем клиенте, используя e.getStatusText()

person antoine    schedule 08.08.2012