[ https://issues.apache.org/jira/browse/CRUNCH-548?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Micah Whitacre updated CRUNCH-548: ---------------------------------- Assignee: Josh Wills > getDetachedValue calls to AvroReflectDeepCopier throw InstantiationException > on non-concrete types > -------------------------------------------------------------------------------------------------- > > Key: CRUNCH-548 > URL: https://issues.apache.org/jira/browse/CRUNCH-548 > Project: Crunch > Issue Type: Bug > Reporter: Adric Eckstein > Assignee: Josh Wills > Fix For: 0.13.0 > > Attachments: CRUNCH-548.patch, CRUNCH-548b.patch > > > A common use case with avro reflection is to operate on an abstract class or > interface which is serialized using a schema based on a concrete subclass (or > union of subclasses). > @org.apache.avro.reflect.Union({ Foo1.class }) > public interface Foo { > public String getFoo(); > } > public class Foo1 implements Foo { > private final Double value = 1.0; > @Override > public String getFoo() { > return value.toString(); > } > } > When trying to operate on this type within crunch, calls to > getDetachedValue() will throw an InstantiationException: > AvroType<Foo> ptype = Avros.reflects(Foo.class, > ReflectData.get().getSchema(Foo.class)); > ptype.initialize(new Configuration()); > Foo copy1 = ptype.getDetachedValue(new Foo1()); > Exception in thread "main" org.apache.crunch.CrunchRuntimeException: > java.lang.InstantiationException: org.mitre.caasd.tt.DeepCopyTest$Foo > at > org.apache.crunch.types.avro.AvroDeepCopier$AvroReflectDeepCopier.createNewInstance(AvroDeepCopier.java:158) > One solution would be to augment the createNewInstance() method in > AvroReflectDeepCopier to create a new instance based on the source object > class, rather than the type class. This would generally be desirable for any > union cases where the source is a subclass of the type class. -- This message was sent by Atlassian JIRA (v6.3.4#6332)