簡體   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