This is an automated email from the ASF dual-hosted git repository.
ffang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new f65f3b9 jackson: add test coverage #2634 (#2672)
f65f3b9 is described below
commit f65f3b92610cdc577403fde5fbaf846ae7a58965
Author: Freeman(Yue) Fang <[email protected]>
AuthorDate: Wed May 26 10:48:59 2021 -0400
jackson: add test coverage #2634 (#2672)
* jackson: add test coverage #2634
(cherry picked from commit e69019354d6a11521d0c61a6183af3b4376ec2bb)
* jackson: address feedback #2634
---
.../jackson/json/JacksonJsonResource.java | 692 +++++++++++++++++++++
.../dataformats/jackson/json/JacksonJsonRoute.java | 179 ++++++
.../component/dataformats/json/model/Order.java | 71 +++
.../component/dataformats/json/model/Pojo.java | 32 +
.../src/main/resources/routes/jackson-routes.xml | 12 +
.../dataformats/jackson/json/JacksonJsonIT.java | 24 +
.../dataformats/jackson/json/JacksonJsonTest.java | 233 +++++++
7 files changed, 1243 insertions(+)
diff --git
a/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonResource.java
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonResource.java
new file mode 100644
index 0000000..a556d88
--- /dev/null
+++
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonResource.java
@@ -0,0 +1,692 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.dataformats.jackson.json;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ConsumerTemplate;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.jackson.JacksonConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.quarkus.component.dataformats.json.model.DummyObject;
+import org.apache.camel.quarkus.component.dataformats.json.model.Order;
+import org.apache.camel.quarkus.component.dataformats.json.model.Pojo;
+import org.apache.camel.quarkus.component.dataformats.json.model.TestJAXBPojo;
+import org.apache.camel.quarkus.component.dataformats.json.model.TestOtherPojo;
+import org.apache.camel.quarkus.component.dataformats.json.model.TestPojo;
+import org.apache.camel.quarkus.component.dataformats.json.model.TestPojoView;
+import org.apache.camel.support.DefaultExchange;
+import org.jboss.logging.Logger;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@Path("/dataformats-json")
+@ApplicationScoped
+public class JacksonJsonResource {
+
+ private static final Logger LOG =
Logger.getLogger(JacksonJsonResource.class);
+ private static final String LS = System.lineSeparator();
+ @Inject
+ ProducerTemplate producerTemplate;
+ @Inject
+ ConsumerTemplate consumerTemplate;
+ @Inject
+ CamelContext context;
+
+ @Path("jackson/unmarshal-typeheader")
+ @GET
+ public void jacksonXmlUnmarshalTypeHeader(String body) throws Exception {
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-unmarshal-type-header-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(TestPojo.class);
+
+ String json = "{\"name\":\"Camel\"}";
+
producerTemplate.sendBodyAndHeader("direct:jackson-unmarshal-type-header-backPojo",
json,
+ JacksonConstants.UNMARSHAL_TYPE, TestPojo.class.getName());
+
+ mock.assertIsSatisfied();
+
+ TestPojo pojo =
mock.getReceivedExchanges().get(0).getIn().getBody(TestPojo.class);
+ assertNotNull(pojo);
+ assertEquals("Camel", pojo.getName());
+ }
+
+ @Path("jackson/unmarshal-list")
+ @GET
+ public void jacksonUnmarshalList(String body) throws Exception {
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-unmarshal-backPojo", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(List.class);
+
+ String json = "[{\"name\":\"Camel\"}, {\"name\":\"World\"}]";
+ producerTemplate.sendBody("direct:jackson-unmarshal-backPojo", json);
+
+ mock.assertIsSatisfied();
+
+ List list =
mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+ assertNotNull(list);
+ assertEquals(2, list.size());
+
+ TestPojo pojo = (TestPojo) list.get(0);
+ assertEquals("Camel", pojo.getName());
+ pojo = (TestPojo) list.get(1);
+ assertEquals("World", pojo.getName());
+
+ mock.expectedMessageCount(2);
+ mock.message(1).body().isInstanceOf(List.class);
+
+ json = "[{\"name\":\"Camel\"}]";
+ producerTemplate.sendBody("direct:jackson-unmarshal-backPojo", json);
+
+ mock.assertIsSatisfied();
+
+ list = mock.getReceivedExchanges().get(1).getIn().getBody(List.class);
+ assertNotNull(list);
+ assertEquals(1, list.size());
+
+ pojo = (TestPojo) list.get(0);
+ assertEquals("Camel", pojo.getName());
+
+ }
+
+ @Path("jackson/unmarshal-listsplit")
+ @GET
+ public void jacksonUnmarshalListSplit(String body) throws Exception {
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-unmarshal-listsplit-result",
MockEndpoint.class);
+ mock.expectedMessageCount(2);
+
mock.expectedMessagesMatches(org.apache.camel.builder.Builder.body().isInstanceOf(DummyObject.class));
+
+ producerTemplate.sendBody("direct:jackson-unmarshal-listsplit-start",
+ "[{\"dummyString\": \"value1\"}, {\"dummyString\":
\"value2\"}]");
+
+ mock.assertIsSatisfied();
+
+ }
+
+ @Path("jackson/marshal-includedefault")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public String jacksonMarshalIncludeDefault() throws Exception {
+ TestOtherPojo pojo = new TestOtherPojo();
+ pojo.setName("Camel");
+ return
producerTemplate.requestBody("direct:jackson-marshal-includedefault-marshal",
+ pojo,
+ String.class);
+ }
+
+ @Path("jackson/unmarshal-array")
+ @GET
+ public void jacksonUnmarshalArray(String body) throws Exception {
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-unmarshal-endArray", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(String[].class);
+
+ String json = "[\"Camel\", \"World\"]";
+ producerTemplate.sendBody("direct:jackson-unmarshal-beginArray", json);
+
+ mock.assertIsSatisfied();
+
+ String[] array =
mock.getReceivedExchanges().get(0).getIn().getBody(String[].class);
+ assertNotNull(array);
+ assertEquals(2, array.length);
+
+ String string = array[0];
+ assertEquals("Camel", string);
+ string = array[1];
+ assertEquals("World", string);
+ }
+
+ @Path("jackson/marshal-contenttype-header")
+ @GET
+ public void jacksonMarshalContentTypeHeader() throws Exception {
+ final Map<String, Object> in = new HashMap<>();
+ in.put("name", "Camel");
+
+ Exchange out =
producerTemplate.request("direct:jackson-marshal-ct-yes", exchange ->
exchange.getIn().setBody(in));
+
+ assertNotNull(out);
+ assertTrue(out.hasOut());
+ assertEquals("application/json",
out.getMessage().getHeader(Exchange.CONTENT_TYPE));
+ out = producerTemplate.request("direct:jackson-marshal-ct-yes2",
exchange -> exchange.getIn().setBody(in));
+
+ assertNotNull(out);
+ assertTrue(out.hasOut());
+ assertEquals("application/json",
out.getMessage().getHeader(Exchange.CONTENT_TYPE));
+
+ out = producerTemplate.request("direct:jackson-marshal-ct-no",
exchange -> exchange.getIn().setBody(in));
+
+ assertNotNull(out);
+ assertTrue(out.hasOut());
+ assertNull(out.getMessage().getHeader(Exchange.CONTENT_TYPE));
+ }
+
+ @Path("jackson/marshal-general")
+ @GET
+ public void jacksonMarshalGeneral() throws Exception {
+ Map<String, Object> in = new HashMap<>();
+ in.put("name", "Camel");
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-marshal-reverse", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(Map.class);
+ mock.message(0).body().isEqualTo(in);
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-marshal-in", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"name\":\"Camel\"}", marshalledAsString);
+
+ producerTemplate.sendBody("direct:jackson-marshal-back", marshalled);
+
+ mock.assertIsSatisfied();
+
+ mock.expectedMessageCount(2);
+ mock.message(1).body().isInstanceOf(Map.class);
+ mock.message(1).body().isEqualTo(in);
+ marshalled =
producerTemplate.requestBody("direct:jackson-marshal-inPretty", in);
+ marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ String expected = String.format("{%s \"name\" : \"Camel\"%s}", LS,
LS);
+ assertEquals(expected, marshalledAsString);
+
+ producerTemplate.sendBody("direct:jackson-marshal-backPretty",
marshalled);
+
+ mock.assertIsSatisfied();
+
+ TestPojo pojo = new TestPojo();
+ pojo.setName("Camel");
+
+ mock = context.getEndpoint("mock:jackson-marshal-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(TestPojo.class);
+ mock.message(0).body().isEqualTo(pojo);
+
+ marshalled =
producerTemplate.requestBody("direct:jackson-marshal-inPojo", pojo);
+ marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"name\":\"Camel\"}", marshalledAsString);
+
+ producerTemplate.sendBody("direct:jackson-marshal-backPojo",
marshalled);
+
+ mock.assertIsSatisfied();
+ }
+
+ @Path("jackson/object-mapper")
+ @GET
+ public void jacksonObjectMapper() throws Exception {
+ Map<String, Object> in = new HashMap<>();
+ in.put("name", "Camel");
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-objectmapper-reverse", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(Map.class);
+ mock.message(0).body().isEqualTo(in);
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-objectmapper-in", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"name\":\"Camel\"}", marshalledAsString);
+
+ producerTemplate.sendBody("direct:jackson-objectmapper-back",
marshalled);
+
+ mock.assertIsSatisfied();
+
+ }
+
+ @Path("jackson/allowjmstype")
+ @GET
+ public void jacksonAllowJmsType() throws Exception {
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-allowjmstype-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(TestPojo.class);
+
+ String json = "{\"name\":\"Camel\"}";
+
producerTemplate.sendBodyAndHeader("direct:jackson-allowjmstype-backPojo",
json, "JMSType", TestPojo.class.getName());
+
+ mock.assertIsSatisfied();
+
+ TestPojo pojo =
mock.getReceivedExchanges().get(0).getIn().getBody(TestPojo.class);
+ assertNotNull(pojo);
+ assertEquals("Camel", pojo.getName());
+ }
+
+ @Path("jackson/marshal-module")
+ @GET
+ public void jacksonMarshalModule() throws Exception {
+ MockEndpoint mock = context.getEndpoint("mock:jackson-module-marshal",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+
mock.message(0).body(String.class).isEqualTo("{\"my-name\":\"Camel\",\"my-country\":\"Denmark\"}");
+
+ TestOtherPojo pojo = new TestOtherPojo();
+ pojo.setName("Camel");
+ pojo.setCountry("Denmark");
+
+ producerTemplate.sendBody("direct:jackson-module-marshal", pojo);
+
+ mock.assertIsSatisfied();
+ }
+
+ @Path("jackson/not-use-default-mapper")
+ @GET
+ public void jacksonNotUseDefaultMapper() throws Exception {
+ Map<String, Object> in = new HashMap<>();
+ in.put("name", "Camel");
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-not-use-default-mapper-reverse",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(Map.class);
+ mock.message(0).body().isEqualTo(in);
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-not-use-default-mapper-in", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"name\":\"Camel\"}", marshalledAsString);
+
+
producerTemplate.sendBody("direct:jackson-not-use-default-mapper-back",
marshalled);
+
+ mock.assertIsSatisfied();
+
+ }
+
+ @Path("jackson/unmarshal-list-xml-configure")
+ @GET
+ public void jacksonUnmarshalListXmlConfigure() throws Exception {
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-xml-unmarshal-list-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(List.class);
+
+ String json = "[{\"name\":\"Camel\"}, {\"name\":\"World\"}]";
+
producerTemplate.sendBody("direct:jackson-xml-unmarshal-list-backPojo", json);
+
+ mock.assertIsSatisfied();
+
+ List list =
mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+ assertNotNull(list);
+ assertEquals(2, list.size());
+
+ TestPojo pojo = (TestPojo) list.get(0);
+ assertEquals("Camel", pojo.getName());
+ pojo = (TestPojo) list.get(1);
+ assertEquals("World", pojo.getName());
+
+ mock.expectedMessageCount(2);
+ mock.message(1).body().isInstanceOf(List.class);
+
+ json = "[{\"name\":\"Camel\"}]";
+
producerTemplate.sendBody("direct:jackson-xml-unmarshal-list-backPojo", json);
+
+ mock.assertIsSatisfied();
+
+ list = mock.getReceivedExchanges().get(1).getIn().getBody(List.class);
+ assertNotNull(list);
+ assertEquals(1, list.size());
+
+ pojo = (TestPojo) list.get(0);
+ assertEquals("Camel", pojo.getName());
+ }
+
+ @Path("jackson/object-mapper-noreg")
+ @GET
+ public void jacksonObjectMapperNoReg() throws Exception {
+ Map<String, Object> in = new HashMap<>();
+ in.put("name", "Camel");
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-objectmapper-noreg-reverse",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(Map.class);
+ mock.message(0).body().isEqualTo(in);
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-objectmapper-noreg-in", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"name\":\"Camel\"}", marshalledAsString);
+
+ producerTemplate.sendBody("direct:jackson-objectmapper-noreg-back",
marshalled);
+
+ mock.assertIsSatisfied();
+
+ mock.expectedMessageCount(2);
+ mock.message(1).body().isInstanceOf(Map.class);
+ mock.message(1).body().isEqualTo(in);
+ marshalled =
producerTemplate.requestBody("direct:jackson-objectmapper-noreg-inPretty", in);
+ marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ String expected = String.format("{%s \"name\" : \"Camel\"%s}", LS,
LS);
+ assertEquals(expected, marshalledAsString);
+
+
producerTemplate.sendBody("direct:jackson-objectmapper-noreg-backPretty",
marshalled);
+
+ mock.assertIsSatisfied();
+
+ TestPojo pojo = new TestPojo();
+ pojo.setName("Camel");
+
+ mock =
context.getEndpoint("mock:jackson-objectmapper-noreg-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(TestPojo.class);
+ mock.message(0).body().isEqualTo(pojo);
+
+ marshalled =
producerTemplate.requestBody("direct:jackson-objectmapper-noreg-inPojo", pojo);
+ marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"name\":\"Camel\"}", marshalledAsString);
+
+
producerTemplate.sendBody("direct:jackson-objectmapper-noreg-backPojo",
marshalled);
+
+ mock.assertIsSatisfied();
+ }
+
+ @Path("jackson/pojo-array")
+ @GET
+ public void jacksonPojoArray() throws Exception {
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-pojo-array-endArray", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(Pojo[].class);
+
+ String json = "[{\"text\":\"Camel\"}, {\"text\":\"World\"}]";
+ producerTemplate.sendBody("direct:jackson-pojo-array-beginArray",
json);
+
+ mock.assertIsSatisfied();
+
+ Pojo[] array =
mock.getReceivedExchanges().get(0).getIn().getBody(Pojo[].class);
+ assertNotNull(array);
+ assertEquals(2, array.length);
+
+ Pojo pojo = array[0];
+ assertEquals("Camel", pojo.getText());
+ pojo = array[1];
+ assertEquals("World", pojo.getText());
+ }
+
+ @Path("jackson/enablefeature")
+ @GET
+ public void jacksonEnableFeature() throws Exception {
+
+ TestPojoView in = new TestPojoView();
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-enablefeature-in", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ // we enable the wrap root type feature so we should have TestPojoView
+
assertEquals("{\"TestPojoView\":{\"age\":30,\"height\":190,\"weight\":70}}",
marshalledAsString);
+ }
+
+ @Path("jackson/concurrent")
+ @GET
+ public void jacksonConcurrent() throws Exception {
+ doSendMessages(10, 5);
+ }
+
+ @Path("jackson/unmarshal-listjackson")
+ @GET
+ public void jacksonUnmarshalListJackson(String body) throws Exception {
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-list-unmarshal-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(List.class);
+
+ String json = "[{\"name\":\"Camel\"}, {\"name\":\"World\"}]";
+ producerTemplate.sendBody("direct:jackson-list-unmarshal-backPojo",
json);
+
+ mock.assertIsSatisfied();
+
+ List list =
mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+ assertNotNull(list);
+ assertEquals(2, list.size());
+
+ TestPojo pojo = (TestPojo) list.get(0);
+ assertEquals("Camel", pojo.getName());
+ pojo = (TestPojo) list.get(1);
+ assertEquals("World", pojo.getName());
+
+ mock.expectedMessageCount(2);
+ mock.message(1).body().isInstanceOf(List.class);
+
+ json = "[{\"name\":\"Camel\"}]";
+ producerTemplate.sendBody("direct:jackson-list-unmarshal-backPojo",
json);
+
+ mock.assertIsSatisfied();
+
+ list = mock.getReceivedExchanges().get(1).getIn().getBody(List.class);
+ assertNotNull(list);
+ assertEquals(1, list.size());
+
+ pojo = (TestPojo) list.get(0);
+ assertEquals("Camel", pojo.getName());
+
+ }
+
+ @Path("jackson/conversion-pojo")
+ @GET
+ public void jacksonConversionPojo(String body) throws Exception {
+ synchronized (context) {
+
context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true");
+
context.getGlobalOptions().put(JacksonConstants.TYPE_CONVERTER_TO_POJO, "true");
+
+ Order order = new Order();
+ order.setAmount(1);
+ order.setCustomerName("Acme");
+ order.setPartName("Camel");
+
+ String json = (String)
producerTemplate.requestBody("direct:jackson-conversion-pojo-test", order);
+
assertEquals("{\"id\":0,\"partName\":\"Camel\",\"amount\":1,\"customerName\":\"Acme\"}",
json);
+
+
context.getGlobalOptions().put(JacksonConstants.TYPE_CONVERTER_MODULE_CLASS_NAMES,
+ JaxbAnnotationModule.class.getName());
+
+ order = new Order();
+ order.setAmount(1);
+ order.setCustomerName("Acme");
+ order.setPartName("Camel");
+
+ json = (String)
producerTemplate.requestBody("direct:jackson-conversion-pojo-test", order);
+ /*
+ * somehow jaxb annotation @XmlAttribute(name = "customer_name")
can't be taken into accout so the
+ * following asserts failed, need to investigate more
+ *
assertEquals("{\"id\":0,\"partName\":\"Camel\",\"amount\":1,\"customer_name\":\"Acme\"}",
+ * json);
+ */
+ }
+
+ }
+
+ @Path("jackson/conversion")
+ @GET
+ public void jacksonConversion(String body) throws Exception {
+ synchronized (context) {
+
context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true");
+ String name = "someName";
+ Map<String, String> pojoAsMap = new HashMap<>();
+ pojoAsMap.put("name", name);
+
+ TestPojo testPojo = (TestPojo)
producerTemplate.requestBody("direct:jackson-conversion-test", pojoAsMap);
+
+ assertEquals(name, testPojo.getName());
+ }
+ }
+
+ @Path("jackson/conversion-simple")
+ @GET
+ public void jacksonConversionSimple(String body) throws Exception {
+ synchronized (context) {
+
context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true");
+ Exchange exchange = new DefaultExchange(context);
+
+ Map<String, String> map = new HashMap<>();
+ Object convertedObject =
context.getTypeConverter().convertTo(String.class, exchange, map);
+ // will do a toString which is an empty map
+ assertEquals(map.toString(), convertedObject);
+
+ convertedObject = context.getTypeConverter().convertTo(Long.class,
exchange,
+ new HashMap<String, String>());
+ assertNull(convertedObject);
+
+ convertedObject = context.getTypeConverter().convertTo(long.class,
exchange,
+ new HashMap<String, String>());
+ assertNull(convertedObject);
+
+ convertedObject =
context.getTypeConverter().convertTo(ExchangePattern.class, exchange, "InOnly");
+ assertEquals(ExchangePattern.InOnly, convertedObject);
+ }
+ }
+
+ @Path("jackson/jaxb-annotation")
+ @GET
+ public void jacksonJaxbAnnotation() throws Exception {
+ TestJAXBPojo in = new TestJAXBPojo();
+ in.setName("Camel");
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-jaxb-annotation-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(TestJAXBPojo.class);
+ mock.message(0).body().isEqualTo(in);
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-jaxb-annotation-inPojo", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"PojoName\":\"Camel\"}", marshalledAsString);
+
+ producerTemplate.sendBody("direct:jackson-jaxb-annotation-backPojo",
marshalled);
+
+ mock.assertIsSatisfied();
+ }
+
+ @Path("jackson/view")
+ @GET
+ public void jacksonView() throws Exception {
+ TestPojoView in = new TestPojoView();
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-view-reversePojoAgeView", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(TestPojoView.class);
+ mock.message(0).body().isEqualTo(in);
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-view-inPojoAgeView", in);
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("{\"age\":30,\"height\":190}", marshalledAsString);
+
+ producerTemplate.sendBody("direct:jackson-view-backPojoAgeView",
marshalled);
+
+ mock.assertIsSatisfied();
+ }
+
+ @Path("jackson/moduleref")
+ @GET
+ public void jacksonModuleRef() throws Exception {
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-module-ref-marshal", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+
mock.message(0).body(String.class).isEqualTo("{\"my-name\":\"Camel\",\"my-country\":\"Denmark\"}");
+
+ TestOtherPojo pojo = new TestOtherPojo();
+ pojo.setName("Camel");
+ pojo.setCountry("Denmark");
+
+ producerTemplate.sendBody("direct:jackson-module-ref-marshal", pojo);
+
+ mock.assertIsSatisfied();
+ }
+
+ @Path("jackson/include-no-null")
+ @GET
+ public void jacksonIncludeNoNull() throws Exception {
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-not-null-marshal", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body(String.class).isEqualTo("{\"name\":\"Camel\"}");
+
+ TestOtherPojo pojo = new TestOtherPojo();
+ pojo.setName("Camel");
+
+ producerTemplate.sendBody("direct:jackson-not-null-marshal", pojo);
+
+ mock.assertIsSatisfied();
+
+ }
+
+ @Path("jackson/typeheader-not-allowed")
+ @GET
+ public void jacksonTypeHeaderNotAllowed() throws Exception {
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-typeheader-not-allowed-reversePojo",
MockEndpoint.class);
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(LinkedHashMap.class);
+
+ String json = "{\"name\":\"Camel\"}";
+
producerTemplate.sendBodyAndHeader("direct:jackson-typeheader-not-allowed-backPojo",
json,
+ JacksonConstants.UNMARSHAL_TYPE, TestPojo.class.getName());
+
+ mock.assertIsSatisfied();
+
+ }
+
+ @Path("jackson/datetimezone")
+ @GET
+ public void jacksonDatetimezone() throws Exception {
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ GregorianCalendar in = new GregorianCalendar(2017, Calendar.APRIL, 25,
17, 0, 10);
+
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-timezone-result", MockEndpoint.class);
+
+ Object marshalled =
producerTemplate.requestBody("direct:jackson-timezone-in", in.getTime());
+ String marshalledAsString =
context.getTypeConverter().convertTo(String.class, marshalled);
+ assertEquals("1493139610000", marshalledAsString);
+
+ mock.expectedMessageCount(1);
+
+ mock.assertIsSatisfied();
+
+ }
+
+ private void doSendMessages(int files, int poolSize) throws Exception {
+ MockEndpoint mock =
context.getEndpoint("mock:jackson-concurrent-result", MockEndpoint.class);
+ mock.expectedMessageCount(files);
+ mock.assertNoDuplicates(org.apache.camel.builder.Builder.body());
+
+ ExecutorService executor = Executors.newFixedThreadPool(poolSize);
+ for (int i = 0; i < files; i++) {
+ final int index = i;
+ executor.submit(new Callable<Object>() {
+ public Object call() throws Exception {
+ TestPojo pojo = new TestPojo();
+ pojo.setName("Hi " + index);
+
+
producerTemplate.sendBody("direct:jackson-concurrent-start", pojo);
+ return null;
+ }
+ });
+ }
+
+ mock.assertIsSatisfied();
+ executor.shutdownNow();
+ }
+
+}
diff --git
a/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonRoute.java
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonRoute.java
new file mode 100644
index 0000000..d67eee2
--- /dev/null
+++
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonRoute.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.quarkus.component.dataformats.jackson.json;
+
+import java.util.TimeZone;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jackson.JacksonConstants;
+import org.apache.camel.component.jackson.JacksonDataFormat;
+import org.apache.camel.component.jackson.ListJacksonDataFormat;
+import org.apache.camel.model.dataformat.JsonLibrary;
+import org.apache.camel.quarkus.component.dataformats.json.model.DummyObject;
+import org.apache.camel.quarkus.component.dataformats.json.model.MyModule;
+import org.apache.camel.quarkus.component.dataformats.json.model.Pojo;
+import org.apache.camel.quarkus.component.dataformats.json.model.TestPojo;
+import org.apache.camel.quarkus.component.dataformats.json.model.TestPojoView;
+import org.apache.camel.quarkus.component.dataformats.json.model.Views;
+
+public class JacksonJsonRoute extends RouteBuilder {
+
+ @Override
+ public void configure() throws Exception {
+ JacksonDataFormat unmarshalTypeHeaderFormat = new JacksonDataFormat();
+ unmarshalTypeHeaderFormat.setAllowUnmarshallType(true);
+
from("direct:jackson-unmarshal-type-header-backPojo").unmarshal(unmarshalTypeHeaderFormat)
+ .to("mock:jackson-unmarshal-type-header-reversePojo");
+
+ JacksonDataFormat listFormat = new JacksonDataFormat(TestPojo.class);
+ listFormat.useList();
+
from("direct:jackson-unmarshal-backPojo").unmarshal(listFormat).to("mock:jackson-unmarshal-backPojo");
+
+ JacksonDataFormat listSplitFormat = new
JacksonDataFormat(DummyObject.class);
+ listSplitFormat.useList();
+
from("direct:jackson-unmarshal-listsplit-start").unmarshal(listSplitFormat).split(body())
+ .to("mock:jackson-unmarshal-listsplit-result");
+
+ JacksonDataFormat includeDefaultFormat = new JacksonDataFormat();
+
from("direct:jackson-marshal-includedefault-marshal").marshal(includeDefaultFormat)
+ .to("mock:jackson-marshal-includedefault-marshal");
+
+
from("direct:jackson-unmarshal-beginArray").unmarshal().json(JsonLibrary.Jackson,
String[].class)
+ .to("mock:jackson-unmarshal-endArray");
+
+ JacksonDataFormat marshalContentTypeformat = new JacksonDataFormat();
+
from("direct:jackson-marshal-ct-yes").marshal(marshalContentTypeformat);
+
from("direct:jackson-marshal-ct-yes2").marshal().json(JsonLibrary.Jackson);
+ JacksonDataFormat formatNoHeader = new JacksonDataFormat();
+ formatNoHeader.setContentTypeHeader(false);
+ from("direct:jackson-marshal-ct-no").marshal(formatNoHeader);
+
+ JacksonDataFormat format = new JacksonDataFormat();
+ from("direct:jackson-marshal-in").marshal(format);
+
from("direct:jackson-marshal-back").unmarshal(format).to("mock:jackson-marshal-reverse");
+ JacksonDataFormat prettyPrintDataFormat = new JacksonDataFormat();
+ prettyPrintDataFormat.setPrettyPrint(true);
+ from("direct:jackson-marshal-inPretty").marshal(prettyPrintDataFormat);
+
from("direct:jackson-marshal-backPretty").unmarshal(prettyPrintDataFormat).to("mock:jackson-marshal-reverse");
+ JacksonDataFormat formatPojo = new JacksonDataFormat(TestPojo.class);
+ from("direct:jackson-marshal-inPojo").marshal(formatPojo);
+
from("direct:jackson-marshal-backPojo").unmarshal(formatPojo).to("mock:jackson-marshal-reversePojo");
+
+ this.getContext().getRegistry().bind("myMapper", new ObjectMapper());
+ JacksonDataFormat objectMapperFormat = new JacksonDataFormat();
+ objectMapperFormat.setAutoDiscoverObjectMapper(true);
+ from("direct:jackson-objectmapper-in").marshal(objectMapperFormat);
+
from("direct:jackson-objectmapper-back").unmarshal(objectMapperFormat).to("mock:jackson-objectmapper-reverse");
+
+ JacksonDataFormat jacksonAllowJmsTypeFormat = new JacksonDataFormat();
+ jacksonAllowJmsTypeFormat.setAllowJmsType(true);
+
from("direct:jackson-allowjmstype-backPojo").unmarshal(jacksonAllowJmsTypeFormat)
+ .to("mock:jackson-allowjmstype-reversePojo");
+
+ JacksonDataFormat jacksonJsonModuleFormat = new JacksonDataFormat();
+ jacksonJsonModuleFormat.setInclude("NON_NULL");
+
jacksonJsonModuleFormat.setModuleClassNames("org.apache.camel.quarkus.component.dataformats.json.model.MyModule");
+
from("direct:jackson-module-marshal").marshal(jacksonJsonModuleFormat).to("mock:jackson-module-marshal");
+
+ JacksonDataFormat jacksonNotUseDefaultMapper = new JacksonDataFormat();
+ jacksonNotUseDefaultMapper.setUseDefaultObjectMapper(false);
+
from("direct:jackson-not-use-default-mapper-in").marshal(jacksonNotUseDefaultMapper);
+
from("direct:jackson-not-use-default-mapper-back").unmarshal(jacksonNotUseDefaultMapper)
+ .to("mock:jackson-not-use-default-mapper-reverse");
+
+ ObjectMapper mapper = new ObjectMapper();
+ JacksonDataFormat jacksonObjectMapperFormat = new JacksonDataFormat();
+ jacksonObjectMapperFormat.setObjectMapper(mapper);
+
+
from("direct:jackson-objectmapper-noreg-in").marshal(jacksonObjectMapperFormat);
+
from("direct:jackson-objectmapper-noreg-back").unmarshal(jacksonObjectMapperFormat)
+ .to("mock:jackson-objectmapper-noreg-reverse");
+
+ JacksonDataFormat jacksonObjectMapperPrettyPrintDataFormat = new
JacksonDataFormat();
+ jacksonObjectMapperPrettyPrintDataFormat.setPrettyPrint(true);
+
+
from("direct:jackson-objectmapper-noreg-inPretty").marshal(jacksonObjectMapperPrettyPrintDataFormat);
+
from("direct:jackson-objectmapper-noreg-backPretty").unmarshal(jacksonObjectMapperPrettyPrintDataFormat)
+ .to("mock:jackson-objectmapper-noreg-reverse");
+
+ JacksonDataFormat jacksonObjectMapperFormatPojo = new
JacksonDataFormat(TestPojo.class);
+
+
from("direct:jackson-objectmapper-noreg-inPojo").marshal(jacksonObjectMapperFormatPojo);
+
from("direct:jackson-objectmapper-noreg-backPojo").unmarshal(jacksonObjectMapperFormatPojo)
+ .to("mock:jackson-objectmapper-noreg-reversePojo");
+
+
from("direct:jackson-pojo-array-beginArray").unmarshal().json(Pojo[].class).to("mock:jackson-pojo-array-endArray");
+
+
from("direct:jackson-concurrent-start").marshal().json(JsonLibrary.Jackson).to("log:marshalled")
+ .to("direct:jackson-concurrent-marshalled");
+
from("direct:jackson-concurrent-marshalled").unmarshal().json(JsonLibrary.Jackson,
TestPojo.class)
+ .to("mock:jackson-concurrent-result");
+
+ from("direct:jackson-list-unmarshal-backPojo").unmarshal(new
ListJacksonDataFormat(TestPojo.class))
+ .to("mock:jackson-list-unmarshal-reversePojo");
+
+
this.getContext().getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER,
"true");
+
+
from("direct:jackson-conversion-pojo-test").convertBodyTo(String.class);
+
+ from("direct:jackson-conversion-test").convertBodyTo(TestPojo.class);
+
+ /*java.lang.ClassNotFoundException:
com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule
+ * in native mode, need to investigate more
+ *
+ * JacksonDataFormat jacksonJaxbAnnotationFormat = new
JacksonDataFormat();
+
from("direct:jackson-jaxb-annotation-in").marshal(jacksonJaxbAnnotationFormat);
+
from("direct:jackson-jaxb-annotation-back").unmarshal(jacksonJaxbAnnotationFormat)
+ .to("mock:jackson-jaxb-annotation-reverse");
+ JacksonDataFormat jacksonJaxbAnnotationFormatPojo = new
JacksonDataFormat(TestJAXBPojo.class);
+
jacksonJaxbAnnotationFormatPojo.setModuleClassNames(JaxbAnnotationModule.class.getName());
+
from("direct:jackson-jaxb-annotation-inPojo").marshal(jacksonJaxbAnnotationFormatPojo);
+
from("direct:jackson-jaxb-annotation-backPojo").unmarshal(jacksonJaxbAnnotationFormatPojo)
+ .to("mock:jackson-jaxb-annotation-reversePojo");
+
+ */
+
+
from("direct:jackson-view-inPojoAgeView").marshal().json(TestPojoView.class,
Views.Age.class);
+
from("direct:jackson-view-backPojoAgeView").unmarshal().json(JsonLibrary.Jackson,
TestPojoView.class)
+ .to("mock:jackson-view-reversePojoAgeView");
+
from("direct:jackson-view-inPojoWeightView").marshal().json(TestPojoView.class,
Views.Weight.class);
+
from("direct:jackson-view-backPojoWeightView").unmarshal().json(JsonLibrary.Jackson,
TestPojoView.class)
+ .to("mock:jackson-view-reversePojoWeightView");
+
+ this.getContext().getRegistry().bind("myJacksonModule", new
MyModule());
+ JacksonDataFormat jacksonModuleRefFormat = new JacksonDataFormat();
+ jacksonModuleRefFormat.setInclude("NON_NULL");
+ jacksonModuleRefFormat.setModuleRefs("myJacksonModule");
+
from("direct:jackson-module-ref-marshal").marshal(jacksonModuleRefFormat).to("mock:jackson-module-ref-marshal");
+
+ JacksonDataFormat jacksonNotNullFormat = new JacksonDataFormat();
+ jacksonNotNullFormat.setInclude("NON_NULL");
+
from("direct:jackson-not-null-marshal").marshal(jacksonNotNullFormat).to("mock:jackson-not-null-marshal");
+
+ JacksonDataFormat jacksonTypeHeaderNotAllowedFormat = new
JacksonDataFormat();
+
from("direct:jackson-typeheader-not-allowed-backPojo").unmarshal(jacksonTypeHeaderNotAllowedFormat)
+ .to("mock:jackson-typeheader-not-allowed-reversePojo");
+
+ JacksonDataFormat jacksonTimeZone = new JacksonDataFormat();
+ TimeZone timeZone = TimeZone.getTimeZone("Africa/Ouagadougou");
+ jacksonTimeZone.setTimezone(timeZone);
+
from("direct:jackson-timezone-in").marshal(jacksonTimeZone).to("mock:jackson-timezone-result");
+ }
+
+}
diff --git
a/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/json/model/Order.java
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/json/model/Order.java
new file mode 100644
index 0000000..e3b0c51
--- /dev/null
+++
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/json/model/Order.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.dataformats.json.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import io.quarkus.runtime.annotations.RegisterForReflection;
+
+@XmlRootElement(name = "order")
+@XmlAccessorType(XmlAccessType.FIELD)
+@RegisterForReflection
+public class Order {
+
+ @XmlAttribute
+ private int id;
+ @XmlAttribute
+ private String partName;
+ @XmlAttribute
+ private int amount;
+ @XmlAttribute(name = "customer_name")
+ private String customerName;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getPartName() {
+ return partName;
+ }
+
+ public void setPartName(String partName) {
+ this.partName = partName;
+ }
+
+ public int getAmount() {
+ return amount;
+ }
+
+ public void setAmount(int amount) {
+ this.amount = amount;
+ }
+
+ public String getCustomerName() {
+ return customerName;
+ }
+
+ public void setCustomerName(String customerName) {
+ this.customerName = customerName;
+ }
+}
diff --git
a/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/json/model/Pojo.java
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/json/model/Pojo.java
new file mode 100644
index 0000000..6700c45
--- /dev/null
+++
b/integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/dataformats/json/model/Pojo.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.dataformats.json.model;
+
+import io.quarkus.runtime.annotations.RegisterForReflection;
+
+@RegisterForReflection
+public class Pojo {
+ private String text;
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+}
diff --git
a/integration-tests/dataformats-json/src/main/resources/routes/jackson-routes.xml
b/integration-tests/dataformats-json/src/main/resources/routes/jackson-routes.xml
index dbb22e2..bfee9c4 100644
---
a/integration-tests/dataformats-json/src/main/resources/routes/jackson-routes.xml
+++
b/integration-tests/dataformats-json/src/main/resources/routes/jackson-routes.xml
@@ -91,6 +91,18 @@
<unmarshal><jacksonxml
unmarshalTypeName="org.apache.camel.quarkus.component.dataformats.json.model.TestPojoView"
jsonViewTypeName="org.apache.camel.quarkus.component.dataformats.json.model.Views$Age"/></unmarshal>
<to uri="mock:jacksonxml-xml-reverseAgeView"/>
</route>
+
+ <route>
+ <from uri="direct:jackson-xml-unmarshal-list-backPojo"/>
+ <unmarshal><json library="Jackson" useList="true"
unmarshalTypeName="org.apache.camel.quarkus.component.dataformats.json.model.TestPojo"/></unmarshal>
+ <to uri="mock:jackson-xml-unmarshal-list-reversePojo"/>
+ </route>
+
+ <route>
+ <from uri="direct:jackson-enablefeature-in"/>
+ <marshal><json library="Jackson"
unmarshalTypeName="org.apache.camel.quarkus.component.dataformats.json.model.TestPojo"
+ enableFeatures="WRAP_ROOT_VALUE"/></marshal>
+ </route>
</routes>
diff --git
a/integration-tests/dataformats-json/src/test/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonIT.java
b/integration-tests/dataformats-json/src/test/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonIT.java
new file mode 100644
index 0000000..7c60ad9
--- /dev/null
+++
b/integration-tests/dataformats-json/src/test/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonIT.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.dataformats.jackson.json;
+
+import io.quarkus.test.junit.NativeImageTest;
+
+@NativeImageTest
+public class JacksonJsonIT extends JacksonJsonTest {
+
+}
diff --git
a/integration-tests/dataformats-json/src/test/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonTest.java
b/integration-tests/dataformats-json/src/test/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonTest.java
new file mode 100644
index 0000000..540b784
--- /dev/null
+++
b/integration-tests/dataformats-json/src/test/java/org/apache/camel/quarkus/component/dataformats/jackson/json/JacksonJsonTest.java
@@ -0,0 +1,233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.dataformats.jackson.json;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.Matchers.equalTo;
+
+@QuarkusTest
+public class JacksonJsonTest {
+ @Test
+ void jacksonUnmarshalTypeHeader() {
+ RestAssured.get("/dataformats-json/jackson/unmarshal-typeheader")
+ .then()
+ .statusCode(204);
+ }
+
+ @Test
+ void jacksonUnmarshalList() {
+ RestAssured.get("/dataformats-json/jackson/unmarshal-list")
+ .then()
+ .statusCode(204);
+ }
+
+ @Test
+ void jacksonUnmarshalListSplit() {
+
+ RestAssured.get("/dataformats-json/jackson/unmarshal-listsplit")
+ .then()
+ .statusCode(204);
+ }
+
+ @Test
+ void jacksonMarshalIncludeDefault() {
+ RestAssured.get("/dataformats-json/jackson/marshal-includedefault")
+ .then()
+ .statusCode(200)
+ .body(equalTo("{\"name\":\"Camel\",\"country\":null}"));
+ }
+
+ @Test
+ void jacksonUnmarshalArray() {
+
+ RestAssured.get("/dataformats-json/jackson/unmarshal-array")
+ .then()
+ .statusCode(204);
+ }
+
+ @Test
+ void jacksonMarshalContentTypeHeader() {
+ RestAssured.get("/dataformats-json/jackson/marshal-contenttype-header")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonMarshalGeneral() {
+ RestAssured.get("/dataformats-json/jackson/marshal-general")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonObjectMapperNoReg() {
+ RestAssured.get("/dataformats-json/jackson/object-mapper-noreg")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonAllowJmsType() {
+ RestAssured.get("/dataformats-json/jackson/allowjmstype")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonMarshalModule() {
+ RestAssured.get("/dataformats-json/jackson/marshal-module")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonNotUseDefaultMapper() {
+ RestAssured.get("/dataformats-json/jackson/not-use-default-mapper")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonUnmarshalListXmlConfigure() {
+
RestAssured.get("/dataformats-json/jackson/unmarshal-list-xml-configure")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonObjectMapper() {
+ RestAssured.get("/dataformats-json/jackson/object-mapper")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonPojoArray() {
+ RestAssured.get("/dataformats-json/jackson/pojo-array")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonEnableFeature() {
+ RestAssured.get("/dataformats-json/jackson/enablefeature")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonConcurrent() {
+ RestAssured.get("/dataformats-json/jackson/concurrent")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonUnmarshalListJackson() {
+ RestAssured.get("/dataformats-json/jackson/unmarshal-listjackson")
+ .then()
+ .statusCode(204);
+
+ }
+
+ //@Test
+ void jacksonConversionPojo() {
+ RestAssured.get("/dataformats-json/jackson/conversion-pojo")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonConversion() {
+ RestAssured.get("/dataformats-json/jackson/conversion")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonConversionSimple() {
+ RestAssured.get("/dataformats-json/jackson/conversion-simple")
+ .then()
+ .statusCode(204);
+
+ }
+
+ //@Test
+ void jacksonJaxbAnnotation() {
+ RestAssured.get("/dataformats-json/jackson/jaxb-annotation")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonView() {
+ RestAssured.get("/dataformats-json/jackson/view")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonModuleRef() {
+ RestAssured.get("/dataformats-json/jackson/moduleref")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonIncludeNoNull() {
+ RestAssured.get("/dataformats-json/jackson/include-no-null")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonTypeHeaderNotAllowed() {
+ RestAssured.get("/dataformats-json/jackson/typeheader-not-allowed")
+ .then()
+ .statusCode(204);
+
+ }
+
+ @Test
+ void jacksonDateTimezone() {
+ RestAssured.get("/dataformats-json/jackson/datetimezone")
+ .then()
+ .statusCode(204);
+
+ }
+
+}