英文:
Spring Boot Exception (Logged from /error controller)
问题
于 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
于 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
于 javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
于 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
于 javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
于 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
于 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
于 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
于 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
于 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
于 com.shiksha.util.filters.PerformanceFilter.doFilter(PerformanceFilter.java:53)
于 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
于 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
于 com.shiksha.util.filters.HttpRequestFilter.doFilter(HttpRequestFilter.java:68)
于 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
于 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
于 org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158)
于 ...
于 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
于 java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
我的 /error 控制器
@RestController
public class IndexController implements ErrorController {
private static final String PATH = "/error";
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
@RequestMapping(value="/*")
public ResponseEntity<?> notFound(HttpServletRequest request) {
Integer statusCode = null;
Exception exception = null;
try {
statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
exception = (Exception) request.getAttribute("javax.servlet.error.exception");
}catch(Exception e) {
logger.error("Index Controller 中的异常情况 1");
}
ValidationErrorResponse validationResponse = new ValidationErrorResponse();
validationResponse.setField("url");
validationResponse.setMessage("未找到 URL。");
HttpStatus finalStatus = HttpStatus.NOT_FOUND;
if(statusCode != null) {
if(statusCode == 404) {
validationResponse.setMessage("未找到 URL。");
}else {
validationResponse.setMessage("发生了一些错误");
}
finalStatus = HttpStatus.valueOf(statusCode);
if(exception != null) {
try {
String exceptionMessage = StringUtils.isNotBlank(exception.getMessage()) ? exception.getMessage() : "异常:从 Index Controller 记录";
LogException.logException(exceptionMessage, exception);
} catch(Exception e) {
logger.error("Index Controller 中的异常情况 2");
}
}
}
validationResponse.setField("url");
return new ResponseEntity<>(validationResponse, finalStatus);
}
@Override
public String getErrorPath() {
return PATH;
}
}
发生的情况是,我的项目中还有 @ExceptionHandler,但在我在生产环境中启动服务后,经过一段时间后,异常不再进入 @ExceptionHandler 中。相反,它们会进入 ErrorController,这不应该发生,因为我已经在 @ExceptionHandler 中捕获了异常。异常通常是 NullPointer 异常,我已经在 @ExceptionHandler 中捕获了这些异常。
英文:
I am getting this exception. Can someone figure out what is the cause behind it?
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.shiksha.util.filters.PerformanceFilter.doFilter(PerformanceFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.shiksha.util.filters.HttpRequestFilter.doFilter(HttpRequestFilter.java:68)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158)
at
...
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NullPointerException
My /error Controller
@RestController
public class IndexController implements ErrorController {
private static final String PATH = "/error";
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
@RequestMapping(value="/*")
public ResponseEntity<?> notFound(HttpServletRequest request) {
Integer statusCode = null;
Exception exception = null;
try {
statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
exception = (Exception) request.getAttribute("javax.servlet.error.exception");
}catch(Exception e) {
logger.error("Exception Case 1 from Index Controller");
}
ValidationErrorResponse validationResponse = new ValidationErrorResponse();
validationResponse.setField("url");
validationResponse.setMessage("Url Not Found.");
HttpStatus finalStatus = HttpStatus.NOT_FOUND;
if(statusCode != null) {
if(statusCode == 404) {
validationResponse.setMessage("Url Not Found.");
}else {
validationResponse.setMessage("Some error occured");
}
finalStatus = HttpStatus.valueOf(statusCode);
if(exception != null) {
try {
String exceptionMessage = StringUtils.isNotBlank(exception.getMessage())?exception.getMessage():"Exception : Logged from Index Controller";
LogException.logException(exceptionMessage, exception);
} catch(Exception e) {
logger.error("Exception Case 2 from Index Controller");
}
}
}
validationResponse.setField("url");
return new ResponseEntity<>(validationResponse, finalStatus);
}
@Override
public String getErrorPath() {
// TODO Auto-generated method stub
return PATH;
}
}
What happens is my Project also has @ExceptionHandler but after I start the service on prod, after some time exceptions stop going to @ExceptionHandler. Instead they are coming at ErrorController which should not happen since I have already catch the Exception. Exceptions are normally NullPointer which I already have caught in @ExceptionHandler.
专注分享java语言的经验与见解,让所有开发者获益!
评论