[ 
https://issues.apache.org/activemq/browse/CAMEL-3143?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=61990#action_61990
 ] 

Claus Ibsen commented on CAMEL-3143:
------------------------------------

Also {{MappingProcessor}} which does the actual mapping is also a big heavy 
weight and not easily customizable.

The {{DozerBeanMapper}} will load the mapping files using thread context 
classloader which doesnt work in that way in OSGi land.
So we end up with this error

{code}
Caused by: org.dozer.MappingException: Unable to locate dozer mapping file 
[org/apache/camel/itest/osgi/dozer/dozer-mapping.xml] in the classpath!
        at 
org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:93)
        at org.dozer.util.MappingValidator.validateURL(MappingValidator.java:61)
        at 
org.dozer.loader.CustomMappingsLoader.loadFromFiles(CustomMappingsLoader.java:101)
        at 
org.dozer.loader.CustomMappingsLoader.load(CustomMappingsLoader.java:57)
        at 
org.dozer.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:153)
        at 
org.dozer.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:136)
        at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:92)
        at 
org.apache.camel.converter.dozer.DozerTypeConverter.convertTo(DozerTypeConverter.java:46)
        at 
org.apache.camel.converter.dozer.DozerTypeConverter.convertTo(DozerTypeConverter.java:50)
        at 
org.apache.camel.impl.converter.DefaultTypeConverter.doConvertTo(DefaultTypeConverter.java:181)
        at 
org.apache.camel.impl.converter.DefaultTypeConverter.mandatoryConvertTo(DefaultTypeConverter.java:136)
{code}

> OsgiDefaultCamelContext.getTypeConverterRegistry() returns null 
> ----------------------------------------------------------------
>
>                 Key: CAMEL-3143
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-3143
>             Project: Apache Camel
>          Issue Type: Bug
>          Components: osgi
>    Affects Versions: 2.4.0
>            Reporter: Claes Redestad
>            Assignee: Claus Ibsen
>
> The showed up when using dozer as shown in 
> http://camel.apache.org/dozer-type-conversion.html, whose 
> DozerTypeConverterLoader tries to get the type converter registry using: 
> {{{TypeConverterRegistry registry = 
> camelContext.getTypeConverterRegistry();}}}
> Plausible error:
> {code:title=OsgiDefaultCamelContext.java}
>    @Override
>     protected TypeConverter createTypeConverter() {
>         return new OsgiTypeConverter(bundleContext, getInjector());
>     }
> {code}
> {code:title=DefaultCamelContext.java}
> public TypeConverterRegistry getTypeConverterRegistry() {
>         if (typeConverterRegistry == null) {
>             // init type converter as its lazy
>             if (typeConverter == null) {
>                 getTypeConverter();
>             }
>             // type converter is usually the default one that also is the 
> registry
>             if (typeConverter instanceof DefaultTypeConverter) {
>                 typeConverterRegistry = (DefaultTypeConverter) typeConverter;
>             }
>         }
>         return typeConverterRegistry;
>     }
> {code}
> Error:
> getTypeConverter() returns an OsgiTypeConverter 
> OsgiTypeConverter does not inherit from DefaultTypeConverter, thus the 
> instanceof returns false
> => null is returned
> Solution:
> Lots of different ways to do this, and it's getting late here. In this case, 
> maybe it's OsgiDefaultCamelContext's responsibility to also override 
> getTypeConverterRegistry with something along the lines of:
> {code}
> @Override
> public TypeConverterRegistry getTypeConverterRegistry() {
>         if (typeConverterRegistry == null) {
>             // init type converter as its lazy
>             if (typeConverter == null) {
>                 getTypeConverter();
>             }
>             // type converter is usually the default one that also is the 
> registry
>             if (typeConverter instanceof OsgiDefaultTypeConverter) {
>                 typeConverterRegistry = ((OsgiDefaultTypeConverter) 
> typeConverter).getRegistry();
>             }
>         }
>         return typeConverterRegistry;
>     }
> {code}
> We've employed an (ugly) workaround in a local version of 
> DozerTypeConverterLoader.java:
> {code:java}
>         TypeConverter typeConverter = camelContext.getTypeConverter();
>         DefaultTypeConverter registry = null;
>         if (typeConverter instanceof DefaultTypeConverter) {
>             registry = (DefaultTypeConverter)typeConverter;
>         } else if (typeConverter instanceof OsgiTypeConverter) {
>             OsgiTypeConverter osgiTypeConverter = 
> (OsgiTypeConverter)typeConverter;
>             registry = osgiTypeConverter.getRegistry();
>         }
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to