pieniak
pieniak

Reputation: 123

arangodb custom JsonDeserializer for document

I'm trying to set custom deserializer for object which I get from arangodb.

MyDocument is class which I store in arangodb:

public class MyDocument {

     private MyContent content;
     ...

     public MyContent getContent() {
       return content;
     }

     public setContent(MyContent content) {
       this.content = content;
     }
}

MyContent is an interface for which I want to have custom deserializer:

@JsonDeserialize(using = MyContentDeserializer.class)
public interface MyContent {
    ...
}

MyContentDeserializer looks like this:

 public class MyContentDeserializer extends JsonDeserializer<MyContent> {
 @Override
     public DocumentContent deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        ...
     }
 }

When I try to get MyDocument from database with

 arangoDriver.getDocument("myDocument", key, MyDocument.class)

MyContentDeserializer.deserialize method isn't execute, instead I got exception:

java.lang.RuntimeException: Unable to invoke no-args constructor for interface MyContent. Register an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$12.construct(ConstructorConstructor.java:210)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:186)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:875)
at com.google.gson.Gson$1.deserialize(Gson.java:128)
at com.arangodb.entity.EntityDeserializers$DocumentEntityDeserializer.deserialize(EntityDeserializers.java:753)
at com.arangodb.entity.EntityDeserializers$DocumentEntityDeserializer.deserialize(EntityDeserializers.java:728)
at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:775)
at com.google.gson.Gson.fromJson(Gson.java:724)
at com.arangodb.entity.EntityFactory.createEntity(EntityFactory.java:162)
at com.arangodb.BaseArangoDriver.createEntityImpl(BaseArangoDriver.java:367)
at com.arangodb.BaseArangoDriver.createEntityWithFallback(BaseArangoDriver.java:259)
at com.arangodb.BaseArangoDriver.createEntity(BaseArangoDriver.java:236)
at com.arangodb.BaseArangoDriver.createEntity(BaseArangoDriver.java:311)
at com.arangodb.impl.InternalDocumentDriverImpl.getDocument(InternalDocumentDriverImpl.java:262)
at com.arangodb.ArangoDriver.getDocument(ArangoDriver.java:1908)
at com.arangodb.ArangoDriver.getDocument(ArangoDriver.java:1893)

Upvotes: 1

Views: 428

Answers (1)

varren
varren

Reputation: 14731

@JsonDeserialize is Jackson annotation and your stacktrace tells us that you use Gson for deserialization. So you have to register Gson deserializer or use Jackson

Upvotes: 1

Related Questions