java.io.IOException: поток закрывается при использовании Camel REST DSL, и существует исключение PredicateValidationException, обработанное с помощью onException - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть эта конечная точка отдыха Camel, которая получает отведения в формате json:

<rests id="restLeads" xmlns="http://camel.apache.org/schema/spring">
    <rest path="/leads">
        <post id="createLead" uri="/" consumes="application/json" >
            <to uri="direct:leads"/>
        </post>
    </rest>
</rests>

Следующий маршрут в конвейере обработки:

    onException(PredicateValidationException.class)
            .handled(true)
            .setHeader(Exchange.HTTP_RESPONSE_CODE).simple("400").to("log:validationError");

    from("direct:leads")
            .id("leadEnricher")
            .unmarshal().json(Lead.class, null)
            .validate(it -> {
                final Lead lead = it.getIn().getBody(Lead.class);
                return lead.isValid();
            })
            ...

Здесь отведение не маршалируется и проверяется,Если это действительно проверить, все работает нормально.Однако при возникновении ошибки проверки запускается блок onException, и я вижу правильное сообщение log: validationError:

validationError  INFO - Exchange[ExchangePattern: InOut, BodyType: com.codependent.dto.Lead, Body: Lead(email=null, product=HOME, pricing=20.0)]

Кроме того, вызывающий клиент получает ожидаемый код ошибки 400: HTTP/1.1 400 Bad Request.

Хотя кажется, что все работает нормально, в конце журнала я получаю эту ошибку:

o.a.c.c.s.CamelHttpTransportServlet ERROR - Error processing request
java.io.IOException: Stream closed
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:372) ~[tomcat-embed-core-8.0.36.redhat-30.jar:8.0.36]
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:156) ~[tomcat-embed-core-8.0.36.redhat-30.jar:8.0.36]
    at org.apache.camel.util.IOHelper.copy(IOHelper.java:202) ~[camel-core-2.21.0.fuse-000112-redhat-3.jar:2.21.0.fuse-000112-redhat-3]
    at org.apache.camel.http.common.DefaultHttpBinding.copyStream(DefaultHttpBinding.java:432) ~[camel-http-common-2.21.0.fuse-000112-redhat-3.jar:2.21.0.fuse-000112-redhat-3]
    at org.apache.camel.http.common.DefaultHttpBinding.doWriteDirectResponse(DefaultHttpBinding.java:496) ~[camel-http-common-2.21.0.fuse-000112-redhat-3.jar:2.21.0.fuse-000112-redhat-3]
    at org.apache.camel.http.common.DefaultHttpBinding.doWriteResponse(DefaultHttpBinding.java:395) ~[camel-http-common-2.21.0.fuse-000112-redhat-3.jar:2.21.0.fuse-000112-redhat-3]
    at org.apache.camel.http.common.DefaultHttpBinding.writeResponse(DefaultHttpBinding.java:322) ~[camel-http-common-2.21.0.fuse-000112-redhat-3.jar:2.21.0.fuse-000112-redhat-3]

Почему я получаю сообщение об ошибке закрытия потока?

ОБНОВЛЕНИЕ:

Как ни странно, если я явно установил тело, ошибка больше не появляется, почему?

onException(PredicateValidationException.class)
            .handled(true)
            .setBody().simple("Validation error for: ${body}")
            .setHeader(Exchange.HTTP_RESPONSE_CODE).simple("400").to("log:validationError");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...