Java 如何在SpringMVC中处理ClientBortException?

Java 如何在SpringMVC中处理ClientBortException?,java,spring,spring-mvc,Java,Spring,Spring Mvc,每当客户端中止连接时,我都会得到一个ClientAbortException日志,如下所示: org.apache.catalina.connector.ClientAbortException: java.io.IOException: APR error: -730053 at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:353) ~[catalina.jar:8.0.26] at

每当客户端中止连接时,我都会得到一个
ClientAbortException
日志,如下所示:

org.apache.catalina.connector.ClientAbortException: java.io.IOException: APR error: -730053
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:353) ~[catalina.jar:8.0.26]
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317) ~[catalina.jar:8.0.26]
    at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110) ~[catalina.jar:8.0.26]
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1022) ~[jackson-core-2.6.5.jar:2.6.5]
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:891) ~[jackson-databind-2.6.5.jar:2.6.5]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:264) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:222) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
问题:由于我不关心客户端是否中止连接,所以我希望阻止日志记录。或者,阻止我的应用程序尝试实际返回响应

我怎么能这样做


我是否可以创建某种全局
@ExceptionHandler(ClientAbortException.class)
,但如果捕获到任何异常,则返回
void

我也遇到了同样的问题,我无法使用Spring MVC和异常处理程序执行您所说的操作。有些异常(我猜是未经检查的)没有被SpringMVC处理程序记录。我所做的是在web.xml中定义一个通用过滤器

  <!-- Filter for exception handling, for those exceptions don't catched by Spring MVC -->
  <filter>
    <filter-name>LoggerFilter</filter-name>
    <filter-class>com.myproject.commons.filters.ExceptionLoggerServletFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoggerFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

由于至少Spring Boot 2.3.4(可能更早),您可以通过以下方法使用
@ControllerAdvice
注释类:

  @ExceptionHandler(ClientAbortException.class)
  public void handleLockException(ClientAbortException exception, HttpServletRequest request) {
    final String message = "ClientAbortException generated by request {} {} from remote address {} with X-FORWARDED-FOR {}";
    final String headerXFF = request.getHeader("X-FORWARDED-FOR");
    log.warn(message, request.getMethod(), request.getRequestURL(), request.getRemoteAddr(), headerXFF);
  }

这正是我最后处理它的方式:添加一个
void
方法,全局捕获
ClientAbortException
,就像您所做的那样@Ortomala您是如何在ControllerAdvice中使用ClientBortException的?
  @ExceptionHandler(ClientAbortException.class)
  public void handleLockException(ClientAbortException exception, HttpServletRequest request) {
    final String message = "ClientAbortException generated by request {} {} from remote address {} with X-FORWARDED-FOR {}";
    final String headerXFF = request.getHeader("X-FORWARDED-FOR");
    log.warn(message, request.getMethod(), request.getRequestURL(), request.getRemoteAddr(), headerXFF);
  }