You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "mayur mohan (Jira)" <ji...@apache.org> on 2026/08/26 05:00:00 UTC

[jira] [Updated] (CAMEL-24489) TypeConversionException prints 'from type: null' for anonymous/local classes (getCanonicalName() returns null)

     [ https://issues.apache.org/jira/browse/CAMEL-24489?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

mayur mohan updated CAMEL-24489:
--------------------------------
    Description: 
h2. Problem

When a type conversion fails and the source value is an anonymous or local class (e.g. {{com.jcraft.jsch.ChannelSftp$2}}), {{TypeConversionException.createMessage()}} prints {{from type: null}} in the error message instead of the actual class name.

This happens because {{Class.getCanonicalName()}} returns {{null}} for anonymous/local/synthetic classes, and the existing code used it directly without a fallback to {{getName()}}.

The body value is *not* null -- only the canonical name of its class is null.

h2. Root Cause

File: {{core/camel-api/src/main/java/org/apache/camel/TypeConversionException.java}}

{code:java}
return "Error during type conversion from type: "
    + (value != null ? value.getClass().getCanonicalName() : null) ...
{code}

{{Class.getCanonicalName()}} returns {{null}} for anonymous/local/synthetic classes such as anonymous inner classes like {{ChannelSftp$2}}. The message then literally prints {{from type: null}} even though the value is not null.

h2. Stack Trace

{noformat}
org.apache.camel.StreamCacheException: Error during type conversion from type: org.apache.camel.component.file.remote.RemoteFile to the required type: org.apache.camel.StreamCache with value RemoteFile[iad@KN3164_OMD.I.170_20260215-205802-554.txt] due to org.apache.camel.TypeConversionException: Error during type conversion from type: null to the required type: org.apache.camel.StreamCache with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
    at org.apache.camel.impl.engine.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:929)
    at org.apache.camel.impl.engine.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:893)
    at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:341)
    at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:109)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:193)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:64)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:185)
    at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:398)
    at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83)
    at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41)
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:485)
    at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:156)
    at org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:202)
    at org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:116)
Caused by: org.apache.camel.TypeConversionException: Error during type conversion from type: null to the required type: org.apache.camel.StreamCache with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
    at org.apache.camel.converter.stream.StreamCacheBulkConverterLoader.convertTo(StreamCacheBulkConverterLoader.java:60)
    at org.apache.camel.spi.BulkTypeConverters.convertTo(BulkTypeConverters.java:122)
    at org.apache.camel.component.file.GenericFileConverter.convertTo(GenericFileConverter.java:103)
    at org.apache.camel.support.SimpleTypeConverter.convertTo(SimpleTypeConverter.java:101)
    at org.apache.camel.impl.converter.CoreTypeConverterRegistry.doConvertTo(CoreTypeConverterRegistry.java:516)
    at org.apache.camel.impl.converter.CoreTypeConverterRegistry.convertTo(CoreTypeConverterRegistry.java:203)
    at org.apache.camel.support.MessageSupport.getBody(MessageSupport.java:96)
    at org.apache.camel.impl.engine.DefaultStreamCachingStrategy.cache(DefaultStreamCachingStrategy.java:208)
    at org.apache.camel.impl.engine.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:922)
    ... 19 more
Caused by: java.io.IOException: error
    at com.jcraft.jsch.ChannelSftp$2.read(ChannelSftp.java:1427)
    at com.jcraft.jsch.ChannelSftp$2.read(ChannelSftp.java:1336)
    at org.apache.camel.util.IOHelper.copy(IOHelper.java:193)
    at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:229)
    at org.apache.camel.converter.stream.StreamCacheConverter.convertToStreamCache(StreamCacheConverter.java:54)
    at org.apache.camel.converter.stream.StreamCacheBulkConverterLoader.doConvertTo(StreamCacheBulkConverterLoader.java:78)
    at org.apache.camel.converter.stream.StreamCacheBulkConverterLoader.convertTo(StreamCacheBulkConverterLoader.java:51)
    ... 31 more
{noformat}

h2. Fix

Add a private {{typeName(Class<?>)}} helper that falls back to {{getName()}} when {{getCanonicalName()}} is null:

{code:java}
private static String typeName(Class<?> clazz) {
    if (clazz == null) { return "null"; }
    String name = clazz.getCanonicalName();
    return name != null ? name : clazz.getName();
}
{code}

h2. Before / After

*Before:*
{noformat}
Error during type conversion from type: null to the required type: org.apache.camel.StreamCache
with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
{noformat}

*After:*
{noformat}
Error during type conversion from type: com.jcraft.jsch.ChannelSftp$2 to the required type: org.apache.camel.StreamCache
with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
{noformat}

h2. PR

https://github.com/apache/camel/pull/25738

  was:TypeConversionException.createMessage() uses getCanonicalName() which returns null for anonymous/local classes. Fix: fall back to getName().

         Labels: camel-api diagnostic  (was: )
       Priority: Minor  (was: Major)
        Summary: TypeConversionException prints 'from type: null' for anonymous/local classes (getCanonicalName() returns null)  (was: TypeConversionException prints 'from type: null' for anonymous/local classes)

> TypeConversionException prints 'from type: null' for anonymous/local classes (getCanonicalName() returns null)
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24489
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24489
>             Project: Camel
>          Issue Type: Bug
>            Reporter: mayur mohan
>            Priority: Minor
>              Labels: camel-api, diagnostic
>
> h2. Problem
> When a type conversion fails and the source value is an anonymous or local class (e.g. {{com.jcraft.jsch.ChannelSftp$2}}), {{TypeConversionException.createMessage()}} prints {{from type: null}} in the error message instead of the actual class name.
> This happens because {{Class.getCanonicalName()}} returns {{null}} for anonymous/local/synthetic classes, and the existing code used it directly without a fallback to {{getName()}}.
> The body value is *not* null -- only the canonical name of its class is null.
> h2. Root Cause
> File: {{core/camel-api/src/main/java/org/apache/camel/TypeConversionException.java}}
> {code:java}
> return "Error during type conversion from type: "
>     + (value != null ? value.getClass().getCanonicalName() : null) ...
> {code}
> {{Class.getCanonicalName()}} returns {{null}} for anonymous/local/synthetic classes such as anonymous inner classes like {{ChannelSftp$2}}. The message then literally prints {{from type: null}} even though the value is not null.
> h2. Stack Trace
> {noformat}
> org.apache.camel.StreamCacheException: Error during type conversion from type: org.apache.camel.component.file.remote.RemoteFile to the required type: org.apache.camel.StreamCache with value RemoteFile[iad@KN3164_OMD.I.170_20260215-205802-554.txt] due to org.apache.camel.TypeConversionException: Error during type conversion from type: null to the required type: org.apache.camel.StreamCache with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
>     at org.apache.camel.impl.engine.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:929)
>     at org.apache.camel.impl.engine.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:893)
>     at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:341)
>     at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:109)
>     at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:193)
>     at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:64)
>     at org.apache.camel.processor.Pipeline.process(Pipeline.java:185)
>     at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:398)
>     at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83)
>     at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41)
>     at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:485)
>     at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:156)
>     at org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:202)
>     at org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:116)
> Caused by: org.apache.camel.TypeConversionException: Error during type conversion from type: null to the required type: org.apache.camel.StreamCache with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
>     at org.apache.camel.converter.stream.StreamCacheBulkConverterLoader.convertTo(StreamCacheBulkConverterLoader.java:60)
>     at org.apache.camel.spi.BulkTypeConverters.convertTo(BulkTypeConverters.java:122)
>     at org.apache.camel.component.file.GenericFileConverter.convertTo(GenericFileConverter.java:103)
>     at org.apache.camel.support.SimpleTypeConverter.convertTo(SimpleTypeConverter.java:101)
>     at org.apache.camel.impl.converter.CoreTypeConverterRegistry.doConvertTo(CoreTypeConverterRegistry.java:516)
>     at org.apache.camel.impl.converter.CoreTypeConverterRegistry.convertTo(CoreTypeConverterRegistry.java:203)
>     at org.apache.camel.support.MessageSupport.getBody(MessageSupport.java:96)
>     at org.apache.camel.impl.engine.DefaultStreamCachingStrategy.cache(DefaultStreamCachingStrategy.java:208)
>     at org.apache.camel.impl.engine.CamelInternalProcessor$StreamCachingAdvice.before(CamelInternalProcessor.java:922)
>     ... 19 more
> Caused by: java.io.IOException: error
>     at com.jcraft.jsch.ChannelSftp$2.read(ChannelSftp.java:1427)
>     at com.jcraft.jsch.ChannelSftp$2.read(ChannelSftp.java:1336)
>     at org.apache.camel.util.IOHelper.copy(IOHelper.java:193)
>     at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:229)
>     at org.apache.camel.converter.stream.StreamCacheConverter.convertToStreamCache(StreamCacheConverter.java:54)
>     at org.apache.camel.converter.stream.StreamCacheBulkConverterLoader.doConvertTo(StreamCacheBulkConverterLoader.java:78)
>     at org.apache.camel.converter.stream.StreamCacheBulkConverterLoader.convertTo(StreamCacheBulkConverterLoader.java:51)
>     ... 31 more
> {noformat}
> h2. Fix
> Add a private {{typeName(Class<?>)}} helper that falls back to {{getName()}} when {{getCanonicalName()}} is null:
> {code:java}
> private static String typeName(Class<?> clazz) {
>     if (clazz == null) { return "null"; }
>     String name = clazz.getCanonicalName();
>     return name != null ? name : clazz.getName();
> }
> {code}
> h2. Before / After
> *Before:*
> {noformat}
> Error during type conversion from type: null to the required type: org.apache.camel.StreamCache
> with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
> {noformat}
> *After:*
> {noformat}
> Error during type conversion from type: com.jcraft.jsch.ChannelSftp$2 to the required type: org.apache.camel.StreamCache
> with value com.jcraft.jsch.ChannelSftp$2@56b4885a due to java.io.IOException: error
> {noformat}
> h2. PR
> https://github.com/apache/camel/pull/25738



--
This message was sent by Atlassian Jira
(v8.20.10#820010)