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() {

Reply via email to