diff --git a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java index 154c38756807b..47726193b32d6 100644 --- a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java +++ b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java @@ -68,6 +68,7 @@ public class JacksonDataFormat extends ServiceSupport implements DataFormat, Dat private String enableFeatures; private String disableFeatures; private boolean enableJacksonTypeConverter; + private boolean allowJacksonUnmarshallType; /** * Use the default Jackson {@link ObjectMapper} and {@link Object} @@ -158,7 +159,10 @@ public Object unmarshal(Exchange exchange, InputStream stream) throws Exception // is there a header with the unmarshal type? Class> clazz = unmarshalType; - String type = exchange.getIn().getHeader(JacksonConstants.UNMARSHAL_TYPE, String.class); + String type = null; + if (allowJacksonUnmarshallType) { + type = exchange.getIn().getHeader(JacksonConstants.UNMARSHAL_TYPE, String.class); + } if (type == null && isAllowJmsType()) { type = exchange.getIn().getHeader("JMSType", String.class); } @@ -326,6 +330,19 @@ public boolean isEnableJacksonTypeConverter() { public void setEnableJacksonTypeConverter(boolean enableJacksonTypeConverter) { this.enableJacksonTypeConverter = enableJacksonTypeConverter; } + + public boolean isAllowJacksonUnmarshallType() { + return allowJacksonUnmarshallType; + } + + /** + * If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the unmarshalling. + *
+ * This should only be enabled when desired to be used. + */ + public void setAllowJacksonUnmarshallType(boolean allowJacksonUnmarshallType) { + this.allowJacksonUnmarshallType = allowJacksonUnmarshallType; + } public String getEnableFeatures() { return enableFeatures; diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalUnmarshalTypeHeaderNotAllowedTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalUnmarshalTypeHeaderNotAllowedTest.java new file mode 100644 index 0000000000000..ffabeebcbae34 --- /dev/null +++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalUnmarshalTypeHeaderNotAllowedTest.java @@ -0,0 +1,54 @@ +/** + * 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.component.jackson; + +import java.util.LinkedHashMap; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Test; + +public class JacksonMarshalUnmarshalTypeHeaderNotAllowedTest extends CamelTestSupport { + + @Test + public void testUnmarshalPojo() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:reversePojo"); + mock.expectedMessageCount(1); + mock.message(0).body().isInstanceOf(LinkedHashMap.class); + + String json = "{\"name\":\"Camel\"}"; + template.sendBodyAndHeader("direct:backPojo", json, JacksonConstants.UNMARSHAL_TYPE, TestPojo.class.getName()); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + + @Override + public void configure() throws Exception { + JacksonDataFormat format = new JacksonDataFormat(); + + from("direct:backPojo").unmarshal(format).to("mock:reversePojo"); + + } + }; + } + +} diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalUnmarshalTypeHeaderTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalUnmarshalTypeHeaderTest.java index 9cb5b59ee1d71..623b32e1ce8a6 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalUnmarshalTypeHeaderTest.java +++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalUnmarshalTypeHeaderTest.java @@ -46,6 +46,7 @@ protected RouteBuilder createRouteBuilder() throws Exception { @Override public void configure() throws Exception { JacksonDataFormat format = new JacksonDataFormat(); + format.setAllowJacksonUnmarshallType(true); from("direct:backPojo").unmarshal(format).to("mock:reversePojo");