Skip to content

Deserializing nested records failsΒ #190

@PaintNinja

Description

@PaintNinja

ObjectDeserializer#deserializeToRecord supports Java records, but doesn't support nesting. For example:

public final class Test {
    private Test() {}

    public record EarlyWindow(int width, int height, boolean maximized) {}
    public record ConfigRecord(boolean versionCheck, int maxThreads, EarlyWindow earlyWindow) {}

    public static void main(String[] args) {
        var obj = ObjectDeserializer.standard();
        var config = Config.inMemory();
        config.set("versionCheck", true);
        config.set("maxThreads", -1);
        config.set("earlyWindow.width", 854);
        config.set("earlyWindow.height", 480);
        config.set("earlyWindow.maximized", false);
        var parsed = obj.deserializeToRecord(config, ConfigRecord.class);
        System.out.println(parsed);
    }
}

The exception is:

Exception in thread "main" com.electronwill.nightconfig.core.serde.SerdeException: Failed to create an instance of record class ga.ozli.novaconfig.internal.Test$ConfigRecord
	at com.electronwill.nightconfig.core.serde.ConfigToPojoDeserializer.deserializeToRecord(ConfigToPojoDeserializer.java:86)
	at com.electronwill.nightconfig.core.serde.ConfigToPojoDeserializer.deserialize(ConfigToPojoDeserializer.java:35)
	at com.electronwill.nightconfig.core.serde.ConfigToPojoDeserializer.deserialize(ConfigToPojoDeserializer.java:19)
	at com.electronwill.nightconfig.core.serde.DeserializerContext.deserializeValue(DeserializerContext.java:36)
	at com.electronwill.nightconfig.core.serde.ObjectDeserializer.deserializeToRecord(ObjectDeserializer.java:120)
	at ga.ozli.novaconfig.internal.Test.main(Test.java:20)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:65)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
	at com.electronwill.nightconfig.core.serde.ConfigToPojoDeserializer.deserializeToRecord(ConfigToPojoDeserializer.java:84)
	... 5 more
Caused by: java.lang.ClassCastException: Cannot cast com.electronwill.nightconfig.core.SimpleConfig to ga.ozli.novaconfig.internal.Test$EarlyWindow
	at java.base/java.lang.Class.cast(Class.java:4067)
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	... 8 more

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions