You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2022/09/02 11:37:00 UTC

[jira] [Updated] (CAMEL-14028) Allow DataFormats to unmarshal known data formats without first converting to bytes

     [ https://issues.apache.org/jira/browse/CAMEL-14028?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen updated CAMEL-14028:
--------------------------------
    Fix Version/s: Future

> Allow DataFormats to unmarshal known data formats without first converting to bytes
> -----------------------------------------------------------------------------------
>
>                 Key: CAMEL-14028
>                 URL: https://issues.apache.org/jira/browse/CAMEL-14028
>             Project: Camel
>          Issue Type: Improvement
>    Affects Versions: 3.0.0
>            Reporter: Stig Rohde Døssing
>            Priority: Minor
>             Fix For: Future
>
>
> The motivating example here is unmarshalling JAXB from a String message body, but the issue exists for other data formats as well, e.g. JSON. In a route like
> {quote}
> from("direct:receive-a-string")
> .unmarshal().jaxb()
> {quote}
> Camel will unnecessarily serialize the String to bytes, then deserialize the bytes to JAXB Java objects. In addition to being inefficient, this can cause encoding issues if the encoding used by Camel to serialize the String doesn't match the encoding set in the XML declaration.
> The reason Camel needs to serialize to bytes is that the [DataFormat|https://github.com/apache/camel/blob/7518aa587c0b887d7e071d6c64c14d91bd0d0e67/core/camel-api/src/main/java/org/apache/camel/spi/DataFormat.java] interface  takes an InputStream parameter in the unmarshal method. Because of this parameter, the [UnmarshalProcessor|https://github.com/apache/camel/blob/3312243b32af03ac39c3af170e318f03e01d64f0/core/camel-support/src/main/java/org/apache/camel/support/processor/UnmarshalProcessor.java#L56] needs to convert the message body to bytes before calling the data format.
> We should be able to introduce a new method with the signature {{unmarshal(Exchange)}}, which would let data formats examine the body's type, and decide whether it is necessary to serialize to bytes before unmarshalling. For instance, the JAXB data format could choose only to serialize to bytes if the input body is not one of the types accepted by the [JAXB Unmarshaller|https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/Unmarshaller.html], or a String.
> We should be able to implement this in a backwards compatible way, by introducing the new method as a default method on the DataFormat interface. The default implementation should extract the exchange message body as an InputStream, and call the existing unmarshal method. We can then update UnmarshalProcessor to only call the new method. 



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