当前位置: 首页 > 面试题库 >

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

苏浩瀚
2023-03-14
问题内容

我有一个称为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杰克逊解决,希望当将jar重新安装到maven存储库或以新版本安装时,您应该能够使用它。



 类似资料:
  • 我实现了一个在另一个堆栈溢出post上找到的方法,允许使用jQuery展开和折叠表行。该方法很简单,工作正常,但我遇到了缺省情况下扩展行的问题。我如何使这些在页面加载时显示为折叠的,以便用户可以决定展开哪些? 作为一个附带说明,有没有什么方法使折叠/展开看起来更平滑,而不是只是瞬间打开或关闭? 谢谢!

  • 问题内容: 是否可以为类型选择性地启用elasticsearch字段的索引? 通过特定索引的映射设置,可以设置属性 {“ index”:“ not_analyzed”} 对于特定领域。由于我的文档中的字段太多,并且将来可能会更改结构,因此我需要一个映射,除非另行指定,否则默认情况下不会分析字段。 这可能吗? 问题答案: 是的- 看一下动态模板 请尝试以下操作: 动态模板适用于您的映射未涵盖的新字段

  • 默认情况下,我们的路由器是Yaf_Router, 而默认使用的路由协议是Yaf_Route_Static,是基于HTTP路由的, 它期望一个请求是HTTP请求并且请求对象是使用Yaf_Request_Http

  • 问题内容: 谁能向我解释为什么Hibernate 默认情况下不设置注释,而是允许实体根据当前设置的属性生成INSERT? 什么是不使用的原因,因此默认情况下包括所有实体属性? 问题答案: @ jb-nizet说了什么。 另外,在我的书中是个坏主意。 从生成的SQL跳过空字段,很快您将发现自己处于声明列的情况,这实际上导致持久数据与休眠知道的实体数据不同。这会造成挫败感,并可能使您诉诸昂贵的电话。

  • 问题内容: 众所周知,根据JLS7 p.4.12.5, 每个实例变量均使用默认值初始化。例如(1): 但是我一直认为,这样的类实现(2): 绝对等于示例(1)。我期望,复杂的Java编译器会看到(2)中的所有这些初始化值都是多余的,并忽略了它们。 但是突然对于这两个类,我们有两个不同的字节码。 例如(1): 例如(2): 问题是: 为什么?但这是显而易见的要优化的事情。什么原因? UPD: 我使用

  • 问题内容: 我有一个关于乐观锁定Hibernate的问题。我试图深入了解Hibernate的乐观锁定,但是我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用@Version批注(或xml配置)并创建一个version属性。另一个选项是使用optimistic- lock =“ all”属性进行配置而不进行版本控制。 我的问题是,如果您没有定义任何版本