Search code examples
javers

Error when trying to fetch changes for class extending HashMap


I'm trying a simple test where I try to commit an object of a Class that extends HashMap. I'm left with a MANAGED_CLASS_MAPPING_ERROR: given javaClass 'class com.vehco.Configuration' is mapped to MapType, expected ManagedType. Do Javers not support is-a but only has-a?

Been reading the documentation forwards and backwards but unable to find anything. Google was neither my friend this time around.

Please find the test code below:

Tester.java:

public class Tester {

Javers javers = JaversBuilder.javers().build();

public static void main(String[] args) {
    Tester t = new Tester();
    t.start();
}

private void start() {
    Configuration data = new Configuration("global");
    for (Integer i = 0; i < 10; i++) {
        data.getProp().put(i.toString(), UUID.randomUUID().toString());
    }
    javers.commit("svenie",data);

    for (Integer i = 0; i < 10; i++) {
        if (i % 2 == 0)
            data.getProp().put(i.toString(), UUID.randomUUID().toString());
    }
    javers.commit("svenie",data);

    List<Shadow<Configuration>> changes = javers.findShadows(QueryBuilder.byClass(Configuration.class).build());
    for (Shadow<Configuration> change : changes) {
        System.out.println(change.getCommitMetadata());
    }
}
}

Configuration.java:

public class Configuration extends HashMap<String,String> {

@Id
private String name;

private Properties prop = new Properties();

public Configuration(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Properties getProp() {
    return prop;
}
}

Solution

  • Looks like the Javers type inferring is ambiguous here. On the one hand your class extends Map so JaVers can infer it as MapType, on the other hand it has @Id property, so JaVers can infer it as Entity. I think you have to decide which Javers type is better for your class and register this class explicitly using JaversBuilder.register*()? A class can't be mapped to more than one Javers type.