2014-04-15 2 views
9

я сделал исключение, что я выбрасываю всегда, когда я хочу страницу 404:Как удалить исключение в качестве исключения @ ResponseStatus-annotated в Spring @ExceptionHandler?

@ResponseStatus(value = HttpStatus.NOT_FOUND) 
public class PageNotFoundException extends RuntimeException { 

Я хочу, чтобы создать контроллер шириной @ExceptionHandler, который будет повторно бросок ArticleNotFoundException (который вызывает ошибку 500), как мой 404 исключение:

@ExceptionHandler(value=ArticleNotFoundException.class) 
public void handleArticleNotFound() { 
    throw new PageNotFoundException(); 
} 

Но это не работает - я до сих пор ошибки 500 и пружинные журналы:

ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: ...

Обратите внимание, что я переводил код в html, поэтому ответ не может быть пустым или простым. Строка как с ResponseEntity. web.xml запись:

<error-page> 
    <location>/resources/error-pages/404.html</location> 
    <error-code>404</error-code> 
</error-page> 

FINAL РЕШЕНИЕ ОТ ОТВЕТА КОММЕНТАРИИ

Это не полный повторно бросить, но, по крайней мере, он использует страницу отображения web.xml ошибки как мой PageNotFoundException

@ExceptionHandler(value = ArticleNotFoundException.class) 
    public void handle(HttpServletResponse response) throws IOException { 
     response.sendError(HttpServletResponse.SC_NOT_FOUND); 

    } 

ответ

7

Вместо выбрасывая исключение, попробуйте это:

@ExceptionHandler(value=ArticleNotFoundException.class) 
public ResponseEntity<String> handleArticleNotFound() { 
    return new ResponseEntity<String>(HttpStatus.NOT_FOUND); 
} 

Это будет в основном вернуть объект Spring, который будет преобразован в контроллер 404 вашим контроллером.

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

Если вы делаете это с аннотациями, просто комментируйте этот метод контроллера с помощью @ResponseStatus и не генерируете исключение.

В принципе, если вы комментируете метод с помощью @ExceptionHandler Я на 90% уверен, что Spring ожидает, что этот метод будет потреблять это исключение, а не выбрасывать другой. Бросая другое исключение, Spring считает, что исключение не было обработано и что обработчик исключений не удалось, следовательно, сообщение в журналах

EDIT:

Чтобы получить его, чтобы вернуться к конкретной странице попробовать

return new ResponseEntity<String>(location/of/your/page.html, HttpStatus.NOT_FOUND); 

EDIT 2: Вы должны быть в состоянии сделать это:

@ExceptionHandler(value=ArticleNotFoundException.class) 
public ResponseEntity<String> handleArticleNotFound(HttpServletResponse response) { 
    response.sendRedirect(location/of/your/page); 
    return new ResponseEntity<String>(HttpStatus.NOT_FOUND); 
} 
+1

Upvoted, но это работает как '404' код, но ** отправляет пустой ответ **. Это отличается от поведения с моим «PageNotFoundException», который переводится в .html-файл с помощью web.xml '' –

+0

. См. Мое редактирование. Мне нравится 50%, что будет работать – JamesENL

+0

. Несчастливо, он принимает эту строку пути как ответ тело, просто отображая его на странице. –

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