我有一个例外,当我想要404页面时总是抛出:
@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 和Spring日志:
ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: ...
请注意,我将代码翻译为html,因此response不能为空或类似的简单String ResponseEntity
。web.xml
条目:
<error-page>
<location>/resources/error-pages/404.html</location>
<error-code>404</error-code>
</error-page>
最终评论的答案
这不是完全重新抛出,但是至少它使用了web.xml
像我这样的错误页面映射PageNotFoundException
@ExceptionHandler( value = ArticleNotFoundException.class )
public void handle( HttpServletResponse response) throws IOException {
response.sendError( HttpServletResponse.SC_NOT_FOUND );
}
不要抛出异常,请尝试以下操作:
@ExceptionHandler( value=ArticleNotFoundException.class )
public ResponseEntity<String> handleArticleNotFound() {
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
}
这基本上将返回一个Spring对象,该对象将由您的控制器转换为404。
如果要将不同的HTTP状态消息返回到前端,可以将其传递给其他HttpStatus。
如果您对使用注解不满意,只需使用@ResponseStatus注释该控制器方法,不要抛出异常。
基本上,如果您使用@ExceptionHandler
90%的方式注释方法,则Spring希望该方法使用该异常而不抛出另一个异常。通过抛出一个不同的异常,Spring认为未处理该异常并且您的异常处理程序失败,因此日志中的消息
编辑:
要使其返回特定页面,请尝试
return new ResponseEntity<String>(location/of/your/page.html, HttpStatus.NOT_FOUND);
编辑2:您应该能够做到这一点:
@ExceptionHandler( value=ArticleNotFoundException.class )
public ResponseEntity<String> handleArticleNotFound(HttpServletResponse response) {
response.sendRedirect(location/of/your/page);
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
}
在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写
业务异常可以使用@ResponseStatus来注解。当异常被抛出时,ResponseStatusExceptionResolver会设置相应的响应状态码。DispatcherServlet会默认注册一个ResponseStatusExceptionResolver以供使用。
我有一个请求- 如果开始时间和结束时间无效,我想抛出一个500错误,但在JSON中返回异常字符串。然而,我得到一个超文本标记语言页面,而不是说 白标错误页面 此应用程序没有/error的显式映射,因此您将其视为一种回退。 Wed Dec20 10:49:37IST 2017 出现意外错误(type=内部服务器错误,状态=500)。 Datetime无效 相反,我想用JSON返回500 我该怎么做?
我有一个方面类,用于记录使用泛型方法之前和之后(周围)的方法执行情况: 在方法中,我抛出了一个在logMethod中捕获的可抛出异常,并抛出了一个自定义异常,而不是类型 在我的控制器建议中,我有以下内容: 项目结构: 控制台:
在阅读了一些关于为Spring创建自定义异常处理程序的博客文章后,我编写了以下类: 其目的是在JSON响应中发送,而不是放弃由于任何原因引发的Spring异常。 然而,这门课不起作用。 例如,当我命中服务器API的无效终结点时,我将获得默认的响应有效载荷: 我错过了什么? 谢谢。
我使用Spring的@ControllerAdvice和@ExceptionHandler进行异常处理。任何方法都会从Controller中抛出自定义异常,并由相应的@ExceptionHandler处理它。如果发生运行时异常(例如任何HibernateException),那么它将抛出运行时异常,并且我没有任何@ExceptionHandler用于运行时异常。
我正在使用@ExceptionHandler来管理我的所有异常,并为任何抛出异常的REST API返回一个JSON响应。目前我管理两个异常,第一个是ResourceNotFoundException,它可以工作,但第二个是FileExtensionException,它不工作。它在eclipse控制台中抛出这个异常,而在rest响应中抛出任何东西。 2015-09-21 09:09:05.197错
我找不到一个好的解决方案:在我的Spring Boot应用程序中,作为一个方法,我需要定义一个处理程序,不是针对特定的异常,而是针对由特定异常(即包装异常)引起的任何异常。 例句:有时候我会这样: 我的自定义是我在一些Hibernate EventListener的预更新方法中抛出的异常,直接异常是无法发生持久性。 但是,以下尝试使用我的自定义异常的方法从未达到: 这里有一个类似的线程,答案是错误