У меня есть эта конечная точка отдыха 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");