This is an automated email from the ASF dual-hosted git repository.
Croway pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 2ff8c7d2aa6d CAMEL-24064: Fix module registration in jackson3 type
converter and wrap JacksonException in data type transformers
2ff8c7d2aa6d is described below
commit 2ff8c7d2aa6d9c30fad17daabb9f598a4f5669c5
Author: croway <[email protected]>
AuthorDate: Wed Jul 15 10:30:22 2026 +0200
CAMEL-24064: Fix module registration in jackson3 type converter and wrap
JacksonException in data type transformers
---
.../jackson3/converter/JacksonTypeConverters.java | 6 +-
.../transform/JsonPojoDataTypeTransformer.java | 3 +-
.../transform/JsonStructDataTypeTransformer.java | 3 +-
.../JacksonConversionsMultipleModulesTest.java | 86 ++++++++++++++++++++++
.../transform/JsonPojoDataTypeTransformerTest.java | 12 +++
.../JsonStructDataTypeTransformerTest.java | 11 +++
6 files changed, 116 insertions(+), 5 deletions(-)
diff --git
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/converter/JacksonTypeConverters.java
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/converter/JacksonTypeConverters.java
index 1caf70f76f9f..ea1a17acb2e8 100644
---
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/converter/JacksonTypeConverters.java
+++
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/converter/JacksonTypeConverters.java
@@ -305,7 +305,7 @@ public final class JacksonTypeConverters {
lock.lock();
try {
if (defaultMapper == null) {
- ObjectMapper mapper = new ObjectMapper();
+ JsonMapper.Builder builder = JsonMapper.builder();
if (moduleClassNames != null) {
for (Object o :
ObjectHelper.createIterable(moduleClassNames)) {
Class<JacksonModule> type
@@ -313,11 +313,11 @@ public final class JacksonTypeConverters {
JacksonModule module =
camelContext.getInjector().newInstance(type);
LOG.debug("Registering module: {} -> {}", o,
module);
- mapper =
JsonMapper.builder().addModule(module).build();
+ builder.addModule(module);
}
}
- defaultMapper = mapper;
+ defaultMapper = builder.build();
}
} finally {
lock.unlock();
diff --git
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformer.java
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformer.java
index 2b710e2c9b8e..c635190ef6dc 100644
---
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformer.java
+++
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformer.java
@@ -35,6 +35,7 @@ import org.apache.camel.spi.MimeType;
import org.apache.camel.spi.Transformer;
import org.apache.camel.util.ObjectHelper;
import tools.jackson.core.FormatSchema;
+import tools.jackson.core.JacksonException;
/**
* Data type able to unmarshal Exchange body to Java object. Supports both
Json schema types and uses Jackson object
@@ -71,7 +72,7 @@ public class JsonPojoDataTypeTransformer extends Transformer
implements CamelCon
}
message.setBody(getJavaObject(message, schemaType, schema,
contentType));
- } catch (InvalidPayloadException | IOException |
ClassNotFoundException e) {
+ } catch (InvalidPayloadException | IOException | JacksonException |
ClassNotFoundException e) {
throw new CamelExecutionException("Failed to apply Java object
data type on exchange", message.getExchange(), e);
}
}
diff --git
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformer.java
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformer.java
index b8433a9e8b6d..b01058c288dc 100644
---
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformer.java
+++
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformer.java
@@ -29,6 +29,7 @@ import org.apache.camel.spi.DataType;
import org.apache.camel.spi.DataTypeTransformer;
import org.apache.camel.spi.MimeType;
import org.apache.camel.spi.Transformer;
+import tools.jackson.core.JacksonException;
import tools.jackson.databind.JsonNode;
/**
@@ -61,7 +62,7 @@ public class JsonStructDataTypeTransformer extends
Transformer {
message.setBody(unmarshalled);
message.setHeader(Exchange.CONTENT_TYPE, MimeType.STRUCT.type());
- } catch (InvalidPayloadException | ClassNotFoundException e) {
+ } catch (InvalidPayloadException | JacksonException |
ClassNotFoundException e) {
throw new CamelExecutionException("Failed to apply Json input data
type on exchange", message.getExchange(), e);
}
}
diff --git
a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/converter/JacksonConversionsMultipleModulesTest.java
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/converter/JacksonConversionsMultipleModulesTest.java
new file mode 100644
index 000000000000..4e846c2efad9
--- /dev/null
+++
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/converter/JacksonConversionsMultipleModulesTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.jackson3.converter;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jackson3.JacksonConstants;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
+import tools.jackson.databind.module.SimpleModule;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class JacksonConversionsMultipleModulesTest extends CamelTestSupport {
+
+ @Test
+ public void shouldRegisterAllConfiguredModules() {
+ context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER,
"true");
+
context.getGlobalOptions().put(JacksonConstants.TYPE_CONVERTER_TO_POJO, "true");
+
context.getGlobalOptions().put(JacksonConstants.TYPE_CONVERTER_MODULE_CLASS_NAMES,
+ FooModule.class.getName() + "," + BarModule.class.getName());
+
+ String foo = (String) template.requestBody("direct:test", new Foo());
+ String bar = (String) template.requestBody("direct:test", new Bar());
+
+ assertEquals("\"foo\"", foo);
+ assertEquals("\"bar\"", bar);
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:test").convertBodyTo(String.class);
+ }
+ };
+ }
+
+ public static class Foo {
+ }
+
+ public static class Bar {
+ }
+
+ public static class FooModule extends SimpleModule {
+ public FooModule() {
+ super("foo-module");
+ addSerializer(Foo.class, new ValueSerializer<Foo>() {
+ @Override
+ public void serialize(Foo value, JsonGenerator gen,
SerializationContext ctxt) {
+ gen.writeString("foo");
+ }
+ });
+ }
+ }
+
+ public static class BarModule extends SimpleModule {
+ public BarModule() {
+ super("bar-module");
+ addSerializer(Bar.class, new ValueSerializer<Bar>() {
+ @Override
+ public void serialize(Bar value, JsonGenerator gen,
SerializationContext ctxt) {
+ gen.writeString("bar");
+ }
+ });
+ }
+ }
+
+}
diff --git
a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformerTest.java
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformerTest.java
index ce9be6d2079f..3b3b2a945786 100644
---
a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformerTest.java
+++
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonPojoDataTypeTransformerTest.java
@@ -17,6 +17,7 @@
package org.apache.camel.component.jackson3.transform;
+import org.apache.camel.CamelExecutionException;
import org.apache.camel.Exchange;
import org.apache.camel.component.jackson3.SchemaHelper;
import org.apache.camel.impl.DefaultCamelContext;
@@ -112,6 +113,17 @@ class JsonPojoDataTypeTransformerTest {
Assertions.assertEquals(19,
exchange.getMessage().getBody(Person.class).age());
}
+ @Test
+ void shouldWrapMalformedJsonInCamelExecutionException() {
+ Exchange exchange = new DefaultExchange(camelContext);
+
+ exchange.setProperty(SchemaHelper.CONTENT_CLASS,
Person.class.getName());
+ exchange.getMessage().setBody("{ this is no json }");
+
+ Assertions.assertThrows(CamelExecutionException.class,
+ () -> transformer.transform(exchange.getMessage(),
DataType.ANY, DataType.ANY));
+ }
+
@Test
public void shouldLookupDataTypeTransformer() throws Exception {
Transformer transformer = camelContext.getTransformerRegistry()
diff --git
a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformerTest.java
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformerTest.java
index bad5cc561f9c..18f7a16a4398 100644
---
a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformerTest.java
+++
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/transform/JsonStructDataTypeTransformerTest.java
@@ -17,6 +17,7 @@
package org.apache.camel.component.jackson3.transform;
+import org.apache.camel.CamelExecutionException;
import org.apache.camel.Exchange;
import org.apache.camel.component.jackson3.SchemaHelper;
import org.apache.camel.impl.DefaultCamelContext;
@@ -93,6 +94,16 @@ class JsonStructDataTypeTransformerTest {
""", exchange.getMessage().getBody(String.class), true);
}
+ @Test
+ void shouldWrapMalformedJsonInCamelExecutionException() {
+ Exchange exchange = new DefaultExchange(camelContext);
+
+ exchange.getMessage().setBody("{ this is no json }");
+
+ Assertions.assertThrows(CamelExecutionException.class,
+ () -> transformer.transform(exchange.getMessage(),
DataType.ANY, DataType.ANY));
+ }
+
@Test
public void shouldLookupDataTypeTransformer() throws Exception {
Transformer transformer = camelContext.getTransformerRegistry()