当前位置: 首页 > 知识库问答 >
问题:

如何让 ControllerAdvice 注释一个类来处理不同类型的异常?

赵华彩
2023-03-14

我有一个名为< code > globalcexceptionhandler 的类,它由< code>ControllerAdvice注释。它正确处理所有< code > NoHandlerFoundExceptions 。我向添加了一个新方法来处理< code>InternalError异常,但它不处理此类异常;因此,我仍然收到< code>HTTP状态500。

基于此链接,< code>500(内部服务器错误)的异常类为< code > ConversionNotSupportedException 。

我尝试了以下代码,但没有捕获内部服务器错误。

1

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleExceptionNotFound(NoHandlerFoundException ex) {
        System.err.println("not found");
        return "redirect:/error";
    }

    @ExceptionHandler(ConversionNotSupportedException.class)
//  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleExceptionsInternalError(ConversionNotSupportedException ex) {
        ex.printStackTrace();
        System.err.println("internal error");
        return "redirect:/error";
    }

}

2.

@ExceptionHandler(ConversionNotSupportedException.class)
public String handleExceptionsInternalError(HttpServletRequest req, ConversionNotSupportedException ex) {

3个

@ExceptionHandler
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleExceptionsInternalError(ConversionNotSupportedException ex) {

我需要处理的异常如下:

HTTP Status 500 - Could not resolve view with name 'user' in servlet with name 'myproject'
javax.servlet.ServletException: Could not resolve view with name 'user' in servlet with name 'myproject'
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1211)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

共有2个答案

汤念
2023-03-14

控制器建议似乎无法处理此类异常。我将以下代码添加到<code>网站中。xml来处理此异常。如果您有更好的解决方案,请告诉我。谢谢

<error-page>
    <error-code>500</error-code>
    <location>/errorhandler</location>
</error-page>
鲁鸿朗
2023-03-14

看起来您的异常处理程序正在返回一个无效的视图,这导致调用异常处理程序的代码中出现异常。请参阅dispatcher servlet . processdispatchresult

在这种情况下,异常是从调度程序Servlet本身引发的,处理它的唯一方法是通过Web.xml

您需要修复异常处理程序以返回有效视图。使用@ExceptionHandler(Exception.class)处理的其他答案是有效的,可以用于处理从控制器引发的异常。

更新:基于@Jack的评论,异常是由一个控制器返回一个不存在的视图引起的(而不是我原来以为的异常处理程序)。一旦您返回一个视图,容器调用视图解析器来呈现它,如果抛出一个异常,将不会调用异常处理程序(参见

另一个选项是覆盖视图resolver.resolveViewName,假设您正在使用InternalResourceViewResolver,如下所示:

public class CustomViewResolver extends InternalResourceViewResolver {
    @Override
    public View resolveViewName(String viewName,
                            Locale locale) throws Exception {
        try{
            return super.resolveViewName();
        } catch (Exception ex) {
            //log
            return new InternalResourceView("urlForErrorView");
       }
    }
}
 类似资料:
  • 我有一个SpringRest申请。我从controller抛出所有异常,并在一个公共位置处理它们,一个名为ExceptionHandlerControllerAdvision的类,用@ControllerAdvision注释。在这里,我有多个用@ExceptionHandler注释的方法来处理每种类型的异常。在这些方法中,我发送自定义错误json响应。在将此错误json发送给使用者之前,我会在日志

  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

  • 我正在使用Spring Boot 1.5.9开发我的应用程序。我需要实现jwt身份验证,我使用了jjwt库。以下代码来自我的自定义身份验证安全筛选器,它继承自。在这里,我试图从令牌解析用户名,当自动解析用户名时,jwt会验证用户名,并检查令牌的过期时间。我调试了它,它可以工作,所以接下来我想向客户端应用发送正确的消息,说明身份验证失败的原因。我想抛出一个ExpiredJwtException,并使

  • 我收到了错误消息: 被精确定位的线在这里: 返回类型为

  • 我使用的是改型2.0.1。我想处理所有类型的网络错误和异常(如没有网络连接,超时错误,服务器找不到等)我已经找到这个链接。但是其中一些方法在V1.8.0中被否决了。在2.0.1中如何做到这一点?

  • 我有一个带有REST方法的控制器类,可以抛出各种异常。我已经决定在一个单独的类中处理这些异常,在我的处理程序方法中使用@ControlllerAdwn和@ExceptionHandler。但是,我有一个问题,我的REST方法使用另一个库的注释。此库捕获REST方法引发的异常。现在,我正在全局处理异常,而不是直接通过REST方法中的试/捕获,我的异常总是被其他库捕获,而不是被我自己的处理程序方法捕获