[ https://issues.apache.org/activemq/browse/CAMEL-3143?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=61997#action_61997 ]
Claus Ibsen commented on CAMEL-3143: ------------------------------------ Thanks Bjorn. I have fixed it so the {{getTypeConverterRegistry}} on {{CamelContext}} returns the osgi aware which is now also a {{TypeConverterRegistry}} so you can add your custom type converters directly to it. So the ugly hack is not needed. Also I have refined the code in {{DozerTypeConverterLoader}} to not use the Dozer CustomerMappingLoader which doesn't work in OSGi. Now the mapping files can be correctly loaded in OSGi. However Dozer bits me later when you use the {{DozerBeanMapper}} because it want's to load the mapping file once again. And the Dozer API is unfriendly to customize so we can't work around this. > 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 > Fix For: 2.5.0 > > > 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.