Can't deserialize list in JsonSubtype when type property is visible (original) (raw)
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) {} }