Radek Kraus created CAMEL-6810:
----------------------------------
Summary: Bean Component/BeanBinding: Body as InputStream parametr
(specified as ${body} in route)
Key: CAMEL-6810
URL: https://issues.apache.org/jira/browse/CAMEL-6810
Project: Camel
Issue Type: Bug
Components: camel-core
Affects Versions: 2.12.1, 2.11.2
Reporter: Radek Kraus
Priority: Minor
I discovered following problem (which was already shortly discussed in [Camel
user
forum|http://camel.465427.n5.nabble.com/Bean-component-Bean-Binding-Body-as-InputStream-parametr-specified-as-body-in-route-td5740656.ht]).
I have a "streamBodyBindingBean" bean with this method:
{code}
public void bodyBinding(InputStream in) throws IOException {
int byteCount = 0;
int c;
while((c = in.read()) != -1)
byteCount++;
System.out.println("ByteCount: " + byteCount);
}
{code}
And this route:
{code}
<route id="" trace="true">
<from uri="direct://body-input-stream-binding-in"/>
<to uri="bean://streamBodyBindingBean?method=bodyBinding(${body})"/>
<!-- to uri="bean://isBodyBindingBean"/-->
<to uri="mock://body-input-stream-binding-out"/>
</route>
{code}
And here is a way how I send exchange from test stuff:
{code}
ByteArrayInputStream in = new ByteArrayInputStream(
"Small body, which I want to bind as InputStream".getBytes("UTF-8")
);
Exchange exchange = createExchangeWithBody(in);
exchange.setPattern(ExchangePattern.InOnly);
template.send("direct://body-input-stream-binding-in", exchange);
{code}
In this case I got a sysout message: {{ByteCount: 0}}, but when I used the
commented variant in the route, I got expected result: {{ByteCount: 47"}}.
When I change the route and use bean component 2 times (both variant of bean
method invocation), then I got:
{noformat}
2013-10-01 12:26:37.259 DEBUG {main} [SendProcessor] >>>>
Endpoint[bean://isBodyBindingBean?method=bodyBinding%28%24%7Bbody%7D%29]
Exchange[Message: [Body is instance of org.apache.camel.StreamCache]]
ByteCount: 0
2013-10-01 12:26:37.289 DEBUG {main} [SendProcessor] >>>>
Endpoint[bean://isBodyBindingBean] Exchange[Message: [Body is instance of
org.apache.camel.StreamCache]]
ByteCount: 47
2013-10-01 12:26:37.307 DEBUG {main} [SendProcessor] >>>>
Endpoint[mock://body-input-stream-binding-out] Exchange[Message: [Body is
instance of org.apache.camel.StreamCache]]
{noformat}
The strange for me is {{MethodInfo}} class, line 526:
{code}
// the parameter value was not already valid, but since the simple language
have evaluated the expression
// which may change the parameterValue, so we have to check it again to see if
its now valid
exp = exchange.getContext().getTypeConverter().convertTo(String.class,
parameterValue);
// String values from the simple language is always valid
if (!valid) {
...
}
{code}
The line after comment caused that my "InputStream" is transformed into String,
what can be a problem in case of "big" InputStream.
I know that I can use only second variant of "bean method invocation", which is
enough for my need, but I only want to point out to this situation.
--
This message was sent by Atlassian JIRA
(v6.1#6144)