Hi there,
I started learning Apache Camel a few days ago and was having difficulty with this simple case: Creating a JSON file from an XML file.
Problem 1: Old version
I picked up a project from a course I was taking. And the version used in this course was out of date. The course was using the dependency 'camel-xmljson,' which has since been removed in the new version.
Upgrading project
So I've decided to upgrade project to use Java 17
and apache camel version 3.18.0
.
To do this, I've needed to import new dependencies on project:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jaxb</artifactId>
<version>${camel-version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>${camel-version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jacksonxml</artifactId>
<version>${camel-version}</version>
</dependency>
Refactoring the code
After import the new dependencies, I needed to refactor my code.
Before refactoring
The code was as follows:
public static void main(String[] args) throws Exception {
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file:pedidos?delay=5s&noop=true").
split().
xpath("/pedido/itens/item").
filter().
xpath("/item/formato[text()='EBOOK']").
marshal().xmljson().
log("${id} - ${body}").
setHeader(Exchange.FILE_NAME, simple("${file:name.noext}-${header.CamelSplitIndex}.json")).
to("file:saida");
}
});
context.start();
Thread.sleep(20000);
context.stop();
}
After refactoring
And now I needed to do this:
public static void main(String[] args) throws Exception {
try (CamelContext context = new DefaultCamelContext()) {
JacksonDataFormat jacksonDataFormat = new JacksonDataFormat();
jacksonDataFormat.setPrettyPrint(true);
jacksonDataFormat.enableFeature(SerializationFeature.WRAP_ROOT_VALUE);
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file:input?delay=5s&noop=true")
.filter()
.xpath("/pedido/itens/item/formato[text()='EBOOK']")
.unmarshal().jacksonXml(Pedido.class)
.marshal(jacksonDataFormat)
.setHeader(Exchange.FILE_NAME, simple("${file:name.noext}.json"))
.to("file:output");
}
});
context.start();
Thread.sleep(20000);
context.stop();
}
}
I needed to use some jackson annotations in "Pedido.java":
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName = "pedido")
public class Pedido {
@JacksonXmlProperty(localName = "id")
private String id;
@JacksonXmlProperty(localName = "dataCompra")
private String dataCompra;
@JacksonXmlProperty(localName = "itens")
private Itens itens;
@JacksonXmlProperty(localName = "pagamento")
private Pagamento pagamento;
....
// getters and setters
Note that 'Before refactoring,' I only needed to use'marshal().xmljson(),' and 'After refactoring,' I needed to do the following:
JacksonDataFormat jacksonDataFormat = new JacksonDataFormat();
jacksonDataFormat.setPrettyPrint(true);
jacksonDataFormat.enableFeature(SerializationFeature.WRAP_ROOT_VALUE);
.unmarshal().jacksonXml(Pedido.class)
.marshal(jacksonDataFormat)
Conclusion
Well, this was the solution I discovered.
I know, there must be a better method, and if you know, left your comment and help me improve. :D
Thank you very much and see you!
Top comments (4)
Thank you for sharing your knowledge, Andre. I've never worked with camel, but I know that is an excellent resource.
Hi João, thanks man.
Me too. I've never worked too. I'm learning in my new challenge.
Great article, André 👏👏👏 Congratulations!!! I miss talking to you, my friend!!! It's been a long time since we chatted!!! I'll DM you soon!!! See ya!!!
Hi Max, thanks man.
I miss talking to you too, lets talk again :D.
I will send a message.
See ya