This is an automated email from the ASF dual-hosted git repository.
gnodet 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 e49c4524f130 CAMEL-23497: Fix NPE in
ManagedTransformerRegistry.listTransformers()
e49c4524f130 is described below
commit e49c4524f1302cabcd6eff80a17407801d502573
Author: Guillaume Nodet <[email protected]>
AuthorDate: Wed May 13 11:56:46 2026 +0200
CAMEL-23497: Fix NPE in ManagedTransformerRegistry.listTransformers()
Handle null from/to DataType in
ManagedTransformerRegistry.listTransformers().
Transformer.getFrom()/getTo() are @Nullable — when a transformer is
registered
by name only, these can be null, causing an NPE when building JMX
CompositeData.
- Add null checks for from/to, using empty string when null
- Fix incorrect test assertions from CAMEL-18698 that expected "camel:any"
- Add dedicated test for transformer with null from/to DataTypes
---
.../mbean/ManagedTransformerRegistry.java | 4 +-
.../management/ManagedTransformerRegistryTest.java | 43 +++++++++++++++++++++-
2 files changed, 44 insertions(+), 3 deletions(-)
diff --git
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedTransformerRegistry.java
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedTransformerRegistry.java
index eec6b2b33d9c..31a9c04c2ac2 100644
---
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedTransformerRegistry.java
+++
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedTransformerRegistry.java
@@ -94,7 +94,9 @@ public class ManagedTransformerRegistry extends
ManagedService implements Manage
CompositeData data = new CompositeDataSupport(
ct, new String[] { "name", "from", "to", "static",
"dynamic", "description" },
- new Object[] { name, from.toString(), to.toString(),
fromStatic, fromDynamic, desc });
+ new Object[] {
+ name, from != null ? from.toString() : "", to
!= null ? to.toString() : "",
+ fromStatic, fromDynamic, desc });
answer.put(data);
}
return answer;
diff --git
a/core/camel-management/src/test/java/org/apache/camel/management/ManagedTransformerRegistryTest.java
b/core/camel-management/src/test/java/org/apache/camel/management/ManagedTransformerRegistryTest.java
index 2cbe86edfdf1..0818ac2e0e3f 100644
---
a/core/camel-management/src/test/java/org/apache/camel/management/ManagedTransformerRegistryTest.java
+++
b/core/camel-management/src/test/java/org/apache/camel/management/ManagedTransformerRegistryTest.java
@@ -29,6 +29,7 @@ import org.apache.camel.Message;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.spi.DataType;
import org.apache.camel.spi.Transformer;
+import org.apache.camel.spi.TransformerKey;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.OS;
@@ -103,8 +104,8 @@ public class ManagedTransformerRegistryTest extends
ManagementTestSupport {
assertEquals("xml:test", to);
} else if (description.startsWith("MyTransformer")) {
assertEquals("custom", name);
- assertEquals("camel:any", from);
- assertEquals("camel:any", to);
+ assertEquals("", from);
+ assertEquals("", to);
} else {
fail("Unexpected transformer:" + description);
}
@@ -112,6 +113,44 @@ public class ManagedTransformerRegistryTest extends
ManagementTestSupport {
assertEquals(2, data.size());
}
+ @Test
+ public void testListTransformersWithNullFromTo() throws Exception {
+ getMockEndpoint("mock:result").expectedMessageCount(1);
+ template.sendBody("direct:start", "Hello World");
+ assertMockEndpointsSatisfied();
+
+ // add a transformer with null from/to directly to the registry
+ Transformer nullTypesTransformer = new MyTransformer();
+ nullTypesTransformer.setName("null-types");
+ context.getTransformerRegistry().put(new TransformerKey("null-types"),
nullTypesTransformer);
+
+ MBeanServer mbeanServer = getMBeanServer();
+ Set<ObjectName> set = mbeanServer.queryNames(new
ObjectName("*:type=services,*"), null);
+ ObjectName on = null;
+ for (ObjectName name : set) {
+ if
(name.getCanonicalName().contains("DefaultTransformerRegistry")) {
+ on = name;
+ break;
+ }
+ }
+ assertNotNull(on, "Should have found TransformerRegistry");
+
+ TabularData data = (TabularData) mbeanServer.invoke(on,
"listTransformers", null, null);
+ assertEquals(3, data.size());
+
+ boolean found = false;
+ for (Object row : data.values()) {
+ CompositeData composite = (CompositeData) row;
+ String name = (String) composite.get("name");
+ if ("null-types".equals(name)) {
+ found = true;
+ assertEquals("", composite.get("from"));
+ assertEquals("", composite.get("to"));
+ }
+ }
+ assertTrue(found, "Should have found the null-types transformer");
+ }
+
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {