Tom*_*urq 6 java subtype 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"),
})
Run Code Online (Sandbox Code Playgroud)
然后是我的Product类的定义.我想要做的是,如果杰克逊不能发现该领域不符合任何这些结构,那么返回
UnknownProduct
我怎么能用Jackson @Type注释做到这一点?它应该是在名称中留空或者某些我不知道的值的标志(我已经尝试创建扩展Product的UnknownProduct并且在名称值中没有任何内容但没有成功.
Ily*_*nov 18
@JsonTypeInfo有一个指定默认实现类的选项,但经过一些调试后我发现WrapperObject的'defaultImpl'被破坏了.组态:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.WRAPPER_OBJECT, defaultImpl = UnknownProduct.class)
Run Code Online (Sandbox Code Playgroud)
Jackson实现(AsWrapperTypeDeserializer):
public AsWrapperTypeDeserializer(JavaType bt, TypeIdResolver idRes,
String typePropertyName, boolean typeIdVisible, Class<?> defaultImpl)
{
super(bt, idRes, typePropertyName, typeIdVisible, null);
}
Run Code Online (Sandbox Code Playgroud)
请注意,传递'defaultImpl'但会被忽略,并且不会使用配置的默认类.我没有在杰克逊的Jira中找到这个问题的登记票.
这只是WRAPPER_OBJECT的问题,defaultImpl适用于其他格式.但它会改变JSON格式.如果您可以更改它 - 您可以使用EXTERNAL_PROPERTY作为默认实现:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type", defaultImpl = UnknownProduct.class)
Run Code Online (Sandbox Code Playgroud)
另一个解决方案:如果你必须使用WRAPPER_OBJECT,那么你可以配置Jackson在发现未知SubType时不会失败:
objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
Run Code Online (Sandbox Code Playgroud)
它与您要求的不完全相同,但在这种情况下,您的产品将为空.可能你可以将null视为未知产品.
更新 我提交了一个Jackson bug:https://github.com/FasterXML/jackson-databind/issues/656
更新此票据已针对2.3和2.4 jackson解决,希望很快您可以在将罐子重新安装到maven存储库或新版本时使用它.
| 归档时间: |
|
| 查看次数: |
6750 次 |
| 最近记录: |