Hi Micael

Yeah that smells like a bug. You are welcome to log a JIRA and if
possible provide an unit test, and/or an attempted fix.

We love contributions
https://github.com/apache/camel/blob/master/CONTRIBUTING.md


On Tue, Jan 8, 2019 at 6:36 PM Micael Kirouac <micael.kiro...@telus.com> wrote:
>
> Hi,
>
> I think I found a potential bug when using a bean to set a property if a 
> message is coming through http. I wanted to check here before opening a bug 
> in case I am missing something. It is very similar to the following bug which 
> has already been fixed: 
> https://stackoverflow.com/questions/40293128/camel-rest-service-throws-exception-when-returning-null/40317432#40317432.
>
> The difference is that instead of returning null, an exception is thrown from 
> the bean method. When that happen, I see the same behavior as described in 
> the stackoverflow post above.  I included an example on how to reproduce at 
> the end of this email. Here is what I think happens:
>
> Problem starts in BeanExpression:
> 1. The exchange is copied, BeanExpression: line 194: Exchange resultExchange 
> = ExchangeHelper.createCopy(exchange, true)
> 2. The out body is then retrieved from the exchange, BeanExpression: line 
> 201: result = resultExchange.getOut().getBody();
> 3. Since out() is null, the in() message is copied to the out(), this makes a 
> copy of the HttpMessage, which is copied along with the original 
> ServletRequest (which contains a closed stream) DefaultExchange.class line 
> 317.
> 4. To copy the message from in to out, the method newInstance() from 
> HttpMessage class is called. HttpMessage line 85
> 5. At this point, the new instance of HttpMessage tries to read the stream 
> from the original message which is already closed, IOException.
>
> Example just below, I would be expecting the EXCEPTION_CAUGHT to be the 
> RuntimeException I throw but instead it's a RuntimeBeanExpressionException 
> effectively wrapping a IOException.
>
> public void configureTestException() {
>   restDefinitionV1 = restDefinitionV1
>     .get("/throwException")
>     .route()
>      .onException(Exception.class)
>        .process(exchange -> {System.out.println("Caught exception of type: " 
> + exchange.getProperty(Exchange.EXCEPTION_CAUGHT).getClass());} )
>        .handled(true)
>      .end()
>        .setProperty("test").method(new TestBean(), "throwException")
>      .endRest();
> }
>
> public static class TestBean {
>   public void throwException() {
>     throw new RuntimeException("Excepting this exception to be handled by 
> onException");
>   }
> }
>
>


-- 
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Reply via email to