From c79b23559421ebb78ac03428b305ebe45e7abda9 Mon Sep 17 00:00:00 2001 From: Duncan Grant Date: Mon, 5 Sep 2016 09:40:48 +0100 Subject: [PATCH] Fix autovalue class loading in karaf When Class.forName is called for a class in a different bundle it will fail as the default karaf class loader won't load classes from other bundles. I have fixed this by using the classloader of the original (non-autovalue) type and assuming it will be in the same bundle as the autovalue type (I think this is a reasonable assumtion). So far the only place where I've actually seen this being an issue is when using the jclouds-labs-google provider within karaf. It fails when serialising the Firewall.Rule class within a FirewallOptions object. --- ...serializationConstructorAndReflectiveTypeAdapterFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/jclouds/json/internal/DeserializationConstructorAndReflectiveTypeAdapterFactory.java b/core/src/main/java/org/jclouds/json/internal/DeserializationConstructorAndReflectiveTypeAdapterFactory.java index de985fd8fc..eff6c9ddce 100644 --- a/core/src/main/java/org/jclouds/json/internal/DeserializationConstructorAndReflectiveTypeAdapterFactory.java +++ b/core/src/main/java/org/jclouds/json/internal/DeserializationConstructorAndReflectiveTypeAdapterFactory.java @@ -132,7 +132,7 @@ public final class DeserializationConstructorAndReflectiveTypeAdapterFactory imp String autoClassName = type.getRawType().getName().replace('$', '_') .replace(packageName + ".", packageName + ".AutoValue_"); try { - type = (TypeToken) TypeToken.get(Class.forName(autoClassName)); + type = (TypeToken) TypeToken.get(type.getRawType().getClassLoader().loadClass(autoClassName)); } catch (ClassNotFoundException ignored) { } }