Spring Boot异常(从/error控制器记录)

huangapple 未分类评论42阅读模式
英文:

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 = &quot;/error&quot;;
	private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

	@RequestMapping(value=&quot;/*&quot;)
	public ResponseEntity&lt;?&gt; notFound(HttpServletRequest request) {

		Integer statusCode = null;
		Exception exception = null;
		try {
			statusCode = (Integer) request.getAttribute(&quot;javax.servlet.error.status_code&quot;);
			exception = (Exception) request.getAttribute(&quot;javax.servlet.error.exception&quot;);
		}catch(Exception e) {
			logger.error(&quot;Exception Case 1 from Index Controller&quot;);
		}
		
		
		ValidationErrorResponse validationResponse = new ValidationErrorResponse();
		validationResponse.setField(&quot;url&quot;);
		validationResponse.setMessage(&quot;Url Not Found.&quot;);
		HttpStatus finalStatus = HttpStatus.NOT_FOUND;
		if(statusCode != null) {
			if(statusCode == 404) {
				validationResponse.setMessage(&quot;Url Not Found.&quot;);
			}else {
				validationResponse.setMessage(&quot;Some error occured&quot;);
			}
			finalStatus = HttpStatus.valueOf(statusCode);
			if(exception != null) {
				try {
					String exceptionMessage = StringUtils.isNotBlank(exception.getMessage())?exception.getMessage():&quot;Exception : Logged from Index Controller&quot;;
					LogException.logException(exceptionMessage, exception);
				} catch(Exception e) {
					logger.error(&quot;Exception Case 2 from Index Controller&quot;);
				}
				
			}
		}
	
		validationResponse.setField(&quot;url&quot;);
		return new ResponseEntity&lt;&gt;(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.

huangapple
  • 本文由 发表于 2020年4月10日 22:25:29
  • 转载请务必保留本文链接:https://java.coder-hub.com/61142364.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定