繁体   English   中英

默认情况下使用Jackson解析为子类

[英]Parse to a Subclass by default with Jackson

我有一个名为Product的类和一些扩展它的子类。 现在在我的注释中我有很多类型,如下所示:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({@Type(value=RoomProduct.class, name="RoomProduct"),
           @Type(value=GroundProduct.class, name="GroundProduct"),
           })

然后是我的Product类的定义。 我想要做的是,如果杰克逊不能发现该领域不符合任何这些结构,那么返回

UnknownProduct

我怎么能用Jackson @Type注释做到这一点? 它应该是在名称中留空或者某些我不知道的值的标志(我已经尝试创建UnknownProduct,它扩展了Product并且没有在名称值中放置任何内容而没有成功。

@JsonTypeInfo有一个指定默认实现类的选项,但经过一些调试后我发现WrapperObject的'defaultImpl'被破坏了。 组态:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.WRAPPER_OBJECT, defaultImpl = UnknownProduct.class)

Jackson实现(AsWrapperTypeDeserializer):

public AsWrapperTypeDeserializer(JavaType bt, TypeIdResolver idRes,
        String typePropertyName, boolean typeIdVisible, Class<?> defaultImpl)
{
    super(bt, idRes, typePropertyName, typeIdVisible, null);
}

请注意,传递'defaultImpl'但会被忽略,并且不会使用配置的默认类。 我没有在杰克逊的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在发现未知SubType时不会失败:

objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);

它与您要求的不完全相同,但在这种情况下,您的产品将为空。 可能你可以将null视为未知产品。

更新我提交了一个Jackson bug: https//github.com/FasterXML/jackson-databind/issues/656

更新此票据已针对2.3和2.4 jackson解决,希望很快您可以在将罐子重新安装到maven存储库或新版本时使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM