@JsonTypeInfo 有一个指定默认实现类的选项,但经过一些调试后,我发现 WrapperObject 的“defaultImpl”已损坏。配置:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.WRAPPER_OBJECT, defaultImpl = UnknownProduct.class)
杰克逊实现(AsWrapperTypeDeserializer):
public AsWrapperTypeDeserializer(JavaType bt, TypeIdResolver idRes,
String typePropertyName, boolean typeIdVisible, Class<?> defaultImpl)
{
super(bt, idRes, typePropertyName, typeIdVisible, null);
}
请注意,'defaultImpl' 被传递,但它被忽略并且配置的默认类将不会被使用。我在 jackson 的 Jira 中没有找到此问题的记录票。
这只是 WRAPPER_OBJECT 的问题,defaultImpl 对其他格式工作正常。但它会改变 JSON 格式。如果你可以改变它——你可以使用 EXTERNAL_PROPERTY 例如默认实现:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type", defaultImpl = UnknownProduct.class)
另一种解决方案:
如果您必须使用 WRAPPER_OBJECT,那么您可以配置 Jackson 在找到未知子类型时不会失败:
objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
这与您所要求的并不完全相同,但在这种情况下,您的产品将为空。也许您可以将 null 视为未知产品。
更新
我已经提交了一个 Jackson 错误:https://github.com/FasterXML/jackson-databind/issues/656
更新此票已针对 2.3 和 2.4 jackson 解决,希望您很快能够在将 jar 重新安装到 maven 存储库或新版本中时使用它。