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)