Как обрабатывать ошибки, происходящие на бэкэнде с Zuul? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть сценарий, представленный здесь .Однако я настроил внутреннюю сторону (ту, которая получает файл и сохраняет его) для приема файлов с максимальным размером 10 МБ.

Моя проблема в том, что я не знаю, как обработать ошибку, которая возникает при отправке файлов размером более 10 МБ.

Вот ошибка, которую я получаю в веб-интерфейсе:

2018-11-19 16:20:51.317  INFO 4868 --- [o-10082-exec-10] o.apache.http.impl.execchain.RetryExec   : I/O exception (java.net.SocketException) caught when processing request to {}->http://localhost:9082: Software caused connection abort: socket write error
2018-11-19 16:20:51.317  WARN 4868 --- [o-10082-exec-10] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering

com.netflix.zuul.exception.ZuulException: null
        at org.springframework.cloud.netflix.zuul.util.ZuulRuntimeException.<init>(ZuulRuntimeException.java:33) ~[spring-cloud-netflix-core-1.4.4.RELEASE.jar:1.4.4.RELEASE]
        at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.run(SimpleHostRoutingFilter.java:207) ~[spring-cloud-netflix-core-1.4.4.RELEASE.jar:1.4.4.RELEASE]
        at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) ~[zuul-core-1.3.0.jar:1.3.0]
        at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) ~[zuul-core-1.3.0.jar:1.3.0]
        [...]
Caused by: org.apache.http.client.ClientProtocolException: null
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187) ~[httpclient-4.5.3.jar:4.5.3]
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118) ~[httpclient-4.5.3.jar:4.5.3]
        at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.forwardRequest(SimpleHostRoutingFilter.java:332) ~[spring-cloud-netflix-core-1.4.4.RELEASE.jar:1.4.4.RELEASE]
        at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.forward(SimpleHostRoutingFilter.java:251) ~[spring-cloud-netflix-core-1.4.4.RELEASE.jar:1.4.4.RELEASE]
        [...]
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:108) ~[httpclient-4.5.3.jar:4.5.3]
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.3.jar:4.5.3]
        [...]
Caused by: java.net.SocketException: Software caused connection abort: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.8.0_92]
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) ~[na:1.8.0_92]
        at java.net.SocketOutputStream.write(SocketOutputStream.java:153) ~[na:1.8.0_92]
        at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124) ~[httpcore-4.4.6.jar:4.4.6]
        [...] 

Ошибка бэкэнда обрабатывается нормально, вот как это выглядит:

16:20:39.764 WARN  [http-nio-9082-exec-1] o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolved exception caused by Handler execution: org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 20971520 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 20971520 bytes.

Любая идея, как мне обработать ошибку бэкэнда?

Конечно, я проверюразмер файла на внешнем интерфейсе также, но мне нужно уметь обрабатывать это исключение изящно.

Заранее спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете создать собственный обработчик ошибок на основе ваших исключений, которые вам нужно обработать.

@ControllerAdvice
public class EntityExceptionHandler 
  extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { ClientProtocolException.class })
    protected ResponseEntity<Object> handleClientProtocol(ClientProtocolException ex, WebRequest request) {
        return handleExceptionInternal(ex, "Here you need to put the error message", 
          new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
    }
}

Здесь вы можете найти способы обработки исключений обработчики ошибок

...