You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "shashank (Jira)" <ji...@apache.org> on 2026/10/03 08:43:00 UTC

[jira] [Created] (CAMEL-25304) camel-barcode - unmarshal fails with NoTypeConversionAvailableException unless the body is a file (byte[] body, image received over HTTP, marshal and unmarshal in one route)

shashank created CAMEL-25304:
--------------------------------

             Summary: camel-barcode - unmarshal fails with NoTypeConversionAvailableException unless the body is a file (byte[] body, image received over HTTP, marshal and unmarshal in one route)
                 Key: CAMEL-25304
                 URL: https://issues.apache.org/jira/browse/CAMEL-25304
             Project: Camel
          Issue Type: Bug
          Components: camel-barcode
            Reporter: shashank


{{BarcodeDataFormat.readImage}} converts the stream it gets from {{unmarshal}} with

{code:java}
final BufferedInputStream in = exchange.getContext().getTypeConverter()
        .mandatoryConvertTo(BufferedInputStream.class, stream);
{code}

The stream is a {{BufferedInputStream}} only when the body is a file ({{IOConverter.toInputStream(File)}} buffers). There is no type converter to {{BufferedInputStream}} from a {{ByteArrayInputStream}} or a stream cache, so for every other body unmarshal fails:

* a {{byte[]}} body (an image from JMS, Kafka, a database, an object store): {{NoTypeConversionAvailableException: No type converter available to convert from type: org.apache.camel.converter.stream.ByteArrayInputStreamCache to the required type: java.io.BufferedInputStream}};
* an {{InputStream}} body, for example an upload received over HTTP: the same with {{InputStreamCache}};
* {{.marshal(barcode).unmarshal(barcode)}} in one route: the same with {{InputStreamCache}}.

The existing tests only unmarshal files, which is why this went unnoticed.

h3. Reproduction

New {{BarcodeUnmarshalStreamTest}}: unmarshal of a QR code PNG given as {{byte[]}}, as {{ByteArrayInputStream}}, and marshal followed by unmarshal in one route: all three fail on main with the exception above. The existing file-based tests are the control.

h3. Proposed fix

Pass the stream to {{ImageIO.read}}, which reads any input stream, instead of converting it. File bodies are read as before. Resource handling is unchanged: {{ImageIO.read(InputStream)}} does not close the stream, and the caller does ({{UnmarshalProcessor}} for an {{InputStream}} body, {{DataFormat.unmarshal(Exchange, Object)}} for the stream it converted the body to). With the fix the module passes (29 tests).

Not in scope: a body that is not an image makes {{ImageIO.read}} return {{null}} and the data format fail with a {{NullPointerException}} (before and after the fix).

Found while checking the round trip property "unmarshal(marshal(text)) = text" of the data format (see CAMEL-25303 about the character set; Lean 4 model there): the round trip could not be run in a route. The Lean model of this step only records which streams convert ({{main_fails_not_file}}, {{fix_total}}); the evidence is the test.

Affected: 4.14.x, 4.18.x and main (the same conversion since 3.0.0 at least).

Duplicate check (2026-10-03): JIRA component camel-barcode (4 issues) and text "barcode" with "unmarshal" / "BufferedInputStream": none. GitHub pull requests "barcode": none on this (open #22358 changes {{getOut()}} to {{getMessage()}} in the same method, a trivial overlap).

_Filed with Claude Code on behalf of allthingssecurity._




--
This message was sent by Atlassian Jira
(v8.20.10#820010)