[ 
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)

Reply via email to