我有一个称为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类。我想做的是,如果Jackson无法检测到该字段不符合任何这些结构,则返回
未知产品
我该如何使用Jackson @Type注释呢?它应该像是在名称中插入空白或在我实际上不知道的值中添加一些标志(我尝试创建扩展了Product的UnknownProduct,并且在名称值中未成功放置任何内容。
@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找不到未知的SubType时不失败:
objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
它与您的要求不完全相同,但是在这种情况下,您的产品将为空。可能您可以将null视为未知产品。
我提交了杰克逊错误的更新:https : //github.com/FasterXML/jackson-databind/issues/656
更新此票证已针对2.3和2.4杰克逊解决,希望当将jars重新安装到maven存储库或新版本中时,您应该能够使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句