Using the latest 2.12.2 version.
Getting com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No fallback setter/field defined for creator property 'ListItem' (through reference chain: cz.smarteon.loxone.system.status.Child["ListItem"]) when parent's @JsonTypeInfo(visible = true).
So it seems it's not possible to have the type property visible, while using collections in subtypes.
I also have more complex scenario, where the deserialization doesn't fail, but the list in subtype is simply not filled (which is even worse). However I wasn't able to make it short enough to include it in report, instead I found this. This could be also related to #426 ? (just a wild guess)
package test;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class VisibleTypePropertyTest {
public static void main(String[] args) throws Exception {
final ObjectMapper mapper = XmlMapper.builder().defaultUseWrapper(false).build();
final String parentXml = "<Item type=\"parent\" someProperty=\"someValue\" />";
final String childXml = "<Item type=\"child\" someProperty=\"someValue2\">" +
"<ListItem name=\"a\"/><ListItem name=\"b\" />" +
"</Item>";
mapper.readValue(parentXml.getBytes(StandardCharsets.UTF_8), Parent.class);
try {
mapper.readValue(childXml.getBytes(StandardCharsets.UTF_8), Parent.class);
} catch (InvalidDefinitionException ex) {
System.out.println("This is the BUG");
ex.printStackTrace();
}
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type", defaultImpl = Parent.class
, visible = true // this triggers the BUG
)
@JsonSubTypes({
@JsonSubTypes.Type(name = "child", value = Child.class)
})
class Parent {
final String visibleType;
final String someProperty;
@JsonCreator
Parent(@JsonProperty("type") final String visibleType, @JsonProperty("someProperty") final String someProperty) {
this.visibleType = visibleType;
this.someProperty = someProperty;
}
}
class Child extends Parent {
final List<ChildItem> list;
@JsonCreator
Child(@JsonProperty("type") final String visibleType, @JsonProperty("someProperty") final String someProperty,
@JsonProperty("ListItem") final List<ChildItem> list) {
super(visibleType, someProperty);
this.list = list;
}
}
class ChildItem {
@JsonCreator
ChildItem(@JsonProperty("name") final String name) {}
}
Using the latest
2.12.2version.Getting
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No fallback setter/field defined for creator property 'ListItem' (through reference chain: cz.smarteon.loxone.system.status.Child["ListItem"])when parent's@JsonTypeInfo(visible = true).So it seems it's not possible to have the
typeproperty visible, while using collections in subtypes.I also have more complex scenario, where the deserialization doesn't fail, but the list in subtype is simply not filled (which is even worse). However I wasn't able to make it short enough to include it in report, instead I found this. This could be also related to #426 ? (just a wild guess)