[
https://issues.apache.org/activemq/browse/CAMEL-3143?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=62015#action_62015
]
Claes Redestad commented on CAMEL-3143:
---------------------------------------
Nicely done!
We've gotten dozer to work in ServiceMix 4.3 by explicitly importing the
resource folder which contains the dozer mapping file, i.e.
{{<Export-Package>mappings</Export-Package>}} in the maven felix plugin.
We had to get this to work inside ServiceMix 4.3, so we improved the previous
temporary workaround some to account for camel-core-osgi being a private
package with an even *uglier* hack to account for the mindboggling fact that
OSGi can load stuff in different classloaders, making us unable to actually
cast to OsgiTypeConverter (as in our previous workaround - test code first,
good, yes yes):
{code}
TypeConverter typeConverter = camelContext.getTypeConverter();
try {
Method method = typeConverter.getClass().getMethod("getRegistry");
registry = (DefaultTypeConverter)method.invoke(typeConverter);
} catch (Throwable t) {
registry = (DefaultTypeConverter)typeConverter;
}
{code}
Cheers!
> 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.