Search code examples
javaarangodbjson-deserialization

Deserialization issue while linking two ArangoDB collection in ArrayList


I have two db collections Agency & Program where an Agency can have many programs and all the further concept implementation is using Programs only. So I have created two POJO

public class Agency implements Serializable {
    @DocumentField(DocumentField.Type.ID)
    private String agencyId;

    @DocumentField(DocumentField.Type.KEY)
    @SerializedName("AGENCYNAME")
    private String agencyName;

    @SerializedName("SHORTNAME")
    private String shortName;

    @Expose(serialize = false, deserialize = true)
    @SerializedName("PROGRAMS")
    private List<Program> programs;

    // Other fields with Getter & Setters
}


public class Program implements Serializable {

    @DocumentField(DocumentField.Type.ID)
    private String programId;

    @SerializedName("PROGRAMNAME")
    private String programName;

    @DocumentField(DocumentField.Type.KEY)
    @SerializedName("SHORTNAME")
    private String shortName;

    @SerializedName("AGENCY")
    private Agency agency;

    // Other fields with Getter & Setters
}

When I run AQL : for a in AGENCY return merge(a, {PROGRAMS: (for p in PROGRAMS FILTER p.AGENCY == a._id return p)})

I get following JSON

[
  {
    "AGENCYNAME": "Dummy Agency 1",
    "SHORTNAME": "DA1",
    "_id": "AGENCY/1062620",
    "_key": "1062620",
    "_rev": "_URnzj-C---",
    "PROGRAMS": [
      {
        "_key": "DA1DP1",
        "_id": "PROGRAMS/DA1DP1",
        "_rev": "_UQ6dGOG---",
        "AGENCY": "AGENCY/1062620",
        "PROGRAMNAME": "DA1 Dummy Program 1",
        "SHORTNAME": "DA1DP1"
      }
    ]
  },
  {
    "AGENCYNAME": "Dummy Agency 2",
    "SHORTNAME": "DA2",
    "_id": "AGENCY/1062358",
    "_key": "1062358",
    "_rev": "_URnzj-C---",
    "PROGRAMS": [
      {
        "_key": "DA2DP1",
        "_id": "PROGRAMS/DA2DP1",
        "_rev": "_UQ6dGOG---",
        "AGENCY": "AGENCY/1062358",
        "PROGRAMNAME": "DA2 Dummy Program 1",
        "SHORTNAME": "DA2DP1"
      }
    ]
  }
]

When I run this query from arangodb-java-driver 4.1 it throws an exception while deserialization com.arangodb.velocypack.exception.VPackValueTypeException: Expecting type OBJECT

and if I comment these lines from Agency.java it works fine, But I need to have List in agency.

    @Expose(serialize = false, deserialize = true)
    @SerializedName("PROGRAMS")
    private List<Program> programs;

Is there a way to handle lists in such cases ? Please suggest a way to overcome this.. Thanks :)


Solution

  • in your POJO Program you have a field agency which is from type Agency but in the JSON you get from the DB this field is from type string. Change type Agency to String and your code works.

    update:

    To get the result from your query which fits into your current java bean, run:

    for a in AGENCY return merge(a, {PROGRAMS: (for p in PROGRAMS FILTER p.AGENCY == a._id return merge(p, {AGENCY: a}))})