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

我们可以用状态码修改错误处理方法吗?

仇浩旷
2023-03-14

我在做一个春靴项目。我正在检查这篇文章中提供的类名为ExceptionHandlerController的代码,并在我的项目中试用了它。它可以工作,但是对于状态代码为400或500系列的错误,我需要包括状态代码。当我在browser address字段中尝试一个简单的无效url时,视图页面error.jsp确实会呈现,但是状态代码没有根据模型信息被访问。我已经包含了HttpServletResponse参数来获取状态代码,但是在404错误中没有显示代码和消息。defaultErrorHanddler方法甚至不会在404错误时激发。我们如何强制方法在400和500个错误时开火?

ExceptionHandlerController:

@ControllerAdvice
public class ExceptionHandlerController
{
   public static final String DEFAULT_ERROR_VIEW = "error";

   private static final HashMap<Integer, String> statusCodes = new HashMap<Integer, String>();

   static {
       statusCodes.put(HttpServletResponse.SC_OK, "OK");
       statusCodes.put(HttpServletResponse.SC_CREATED, "Created");
       statusCodes.put(HttpServletResponse.SC_ACCEPTED, "Accepted");
       statusCodes.put(HttpServletResponse.SC_NON_AUTHORITATIVE_INFORMATION, "Non-authoritative Information");
       statusCodes.put(HttpServletResponse.SC_NO_CONTENT, "No Content");
       statusCodes.put(HttpServletResponse.SC_RESET_CONTENT, "Reset Content");
       statusCodes.put(HttpServletResponse.SC_PARTIAL_CONTENT, "Partial Content");         
       statusCodes.put(HttpServletResponse.SC_BAD_REQUEST, "Bad Request");
       statusCodes.put(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
       statusCodes.put(HttpServletResponse.SC_PAYMENT_REQUIRED, "Payment Required");
       statusCodes.put(HttpServletResponse.SC_FORBIDDEN, "Forbidden");
       statusCodes.put(HttpServletResponse.SC_NOT_FOUND, "Not Found");
       statusCodes.put(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method Not Allowed");
       statusCodes.put(HttpServletResponse.SC_NOT_ACCEPTABLE, "Not Acceptable");
       statusCodes.put(HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED, "Proxy Authentication Required");
       statusCodes.put(HttpServletResponse.SC_REQUEST_TIMEOUT, "Request Timeout");
       statusCodes.put(HttpServletResponse.SC_CONFLICT, "Conflict");
       statusCodes.put(HttpServletResponse.SC_GONE, "Gone");       
       statusCodes.put(HttpServletResponse.SC_LENGTH_REQUIRED, "Length Required");
       statusCodes.put(HttpServletResponse.SC_PRECONDITION_FAILED, "Precondition Failed");
       statusCodes.put(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE, "Request entity Too Large");
       statusCodes.put(HttpServletResponse.SC_REQUEST_URI_TOO_LONG, "Request-URI Too Long");
       statusCodes.put(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "Unsupported Media Type");
       statusCodes.put(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE, "Requested Range Not Satisfiable");
       statusCodes.put(HttpServletResponse.SC_EXPECTATION_FAILED, "Expectation Failed");
       statusCodes.put(HttpServletResponse.SC_PRECONDITION_FAILED, "Precondition Required");           
       statusCodes.put(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Internal Server Error");
       statusCodes.put(HttpServletResponse.SC_NOT_IMPLEMENTED, "Not Implemented");
       statusCodes.put(HttpServletResponse.SC_BAD_GATEWAY, "Bad Gateway");
       statusCodes.put(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Service Unavailable");
       statusCodes.put(HttpServletResponse.SC_GATEWAY_TIMEOUT, "Gateway Timeout");
       statusCodes.put(HttpServletResponse.SC_HTTP_VERSION_NOT_SUPPORTED, "HTTP Version Not Supported");

   }  


   @ExceptionHandler(value={Exception.class, RuntimeException.class})
   public ModelAndView defaultErrorHanddler(HttpServletRequest request, Exception e, HttpServletResponse response)
   {
       ModelAndView mav = new ModelAndView(DEFAULT_ERROR_VIEW);
       int scode = response.getStatus();
       System.out.println("scode: " + scode);
       mav.addObject("statuscode", String.valueOf(scode));
       mav.addObject("message", statusCodes.get(scode));
       mav.addObject("datetime", new Date());
       mav.addObject("exception", e);
       mav.addObject("url", request.getRequestURL());
       return mav;
   }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML>
<html>
<head>
<title></title>
...
</head>
<body>
<div class="container">
<h1>Error Details</h1> 
    <p>Status Code: ${statuscode}</p>
    <p>Message: ${message}</p>
    <p>TimeStamp: ${datetime}</p>
    <p>Exception: ${exception}</p>
    <p>URL: ${url}</p>
    <p><a href="/">Home Page</a></p>    
</div>
</body>
</html>

共有1个答案

鲜于浩淼
2023-03-14

或者,您可以使用@responsestatus注释您的方法,例如:

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = {Exception.class, RuntimeException.class})
public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) {
        ModelAndView mav = new ModelAndView(DEFAULT_ERROR_VIEW);

    mav.addObject("datetime", new Date());
    mav.addObject("exception", e);
    mav.addObject("url", request.getRequestURL());
    return mav;
}
 类似资料:
  • 问题内容: 考虑以下代码: 您希望它能打印,但是会引发,这是我试图避免的错误。那么可以使用块来处理所有异常吗?好吧,如果是例外,为什么它包含在内置例外中?最后我该如何修复上面的代码,使其正确处理异常? 注意:我知道我要做什么完全没有意义,也没有真正的目的 问题答案: 是一个完全普通的内置异常。这一点都不特殊。仅在(通常)抛出时的情况有点不寻常。 语法错误意味着 无法解析 具有该错误的代码。它甚至没

  • 我阅读了Kafka streams关于添加全局存储的用例,这个stackover流讨论,并了解了在恢复过程中全局状态存储跳过处理器。 但是我想要如何能够强制全局状态存储运行处理器在恢复过程中与处理器API。

  • 问题内容: 我想知道非静态方法如何修改静态变量。我知道静态方法只能访问其他静态方法和静态变量。但是,另一面是真的吗?非静态方法只能访问非静态变量吗?例如: 这段代码可以编译,我想知道为什么要使用静态访问特权。 问题答案: 我已经从The Java Tutorials找到了 实例方法可以直接访问实例变量和实例方法。 实例方法可以直接访问类变量和类方法。 类方法可以直接访问类变量和类方法。 类方法不能

  • 关于Firebase web平台将本地修改的数据同步到服务器,我有两个相关的问题: 每个共享Firebase数据库的客户机都维护任何活动数据的内部版本。在更新或保存数据时,将其写入数据库的此本地版本。然后,Firebase客户机将数据与Firebase服务器和其他客户机进行“尽力而为”的同步。 数据修改方法(、等)可以采用回调参数: null 权限被拒绝(由于安全规则)? 数据库位置不存在? 有没

  • 如何在SpringMVC中实现自定义http错误处理。 例如:我有一个urlhttp://localhost:8080/demo/canvas 它显示我的画布页面,但如果用户错过了网址并键入http://localhost:8080/demo/canva 它显示了Tomcat呈现的HTTP状态404。我希望它是自定义jsp页面。

  • 问题内容: 我知道jython允许我们从任何Java的类文件中调用Java方法,就好像它们是为python编写的一样,但是相反的可能吗? 我已经有很多用python编写的算法,它们在python和jython上都可以很好地工作,但是它们缺少适当的GUI。我计划将GUI与Jav​​a一起使用,并保持python库完整。我无法使用jython或python编写良好的GUI,也无法使用python编写良