当前位置: 首页 > 知识库问答 >
问题:

杰克逊Android NPE 当使用米辛

叶德运
2023-03-14

我的服务器 API 使用不同类型的多态对象。例如,我有一个 json:

{
  "eventType": "FirstType",
  "eventData": "some-useful-object"
}

科特林为它上课:

sealed class NotificationEvent {

  data class SomeUsefulEvent(val eventData: String): NotificationEvent()

}

和mixin类:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "eventType"
)
@JsonSubTypes(
    JsonSubTypes.Type(
        value = NotificationEvent.SomeUsefulEvent::class,
        name = "FirstType"
    )
)
abstract class NotificationEventMixIn

当我从客户端呼叫时

jsonMapper.readValue<NotificationEvent>(event.data)

应用程序崩溃并显示 NPE:

java.lang.NullPointerException:尝试对com . faster XML . Jackson . databind . intro SPECT . annotatedfieldcollector . _ addFieldMixIns(annotatedfieldcollector . Java:110)处的空对象引用调用接口方法“Java . lang . object Java . util . map . get(Java . lang . object)”

我怎样才能避免这种崩溃?

共有1个答案

白成济
2023-03-14

在研究上浪费了一些时间之后,我发现在注释字段收集器#_findFields中有一个块调用JavaType.getRawClass(.getDeclaredFields()的块,如果它返回一个空数组,则跳过所有 for 块,映射_fields未初始化,并且在调用_addFieldMixIns时保持值。

这是因为属性不是kotlin中的字段,并且父类没有字段。

可以通过将@JvmField带注释的属性添加到通知事件类来解决,如下所示:

sealed class NotificationEvent {

  @Suppress("unused")
  @JvmField val stub: Int = 0

  data class SomeUsefulEvent(val eventData: String): NotificationEvent()

}

一切正常!

我希望这个问题能帮助某人,我鼓励杰克逊团队修复这个错误

 类似资料:
  • 我已经发布了类似的东西,但我仍然试图集中在我的问题上。 谢谢你能容忍我。 com.fasterxml.jackson.databind.jsonMappingException:无法构造FHIR.Element的实例,问题:抽象类型要么需要映射到具体类型,有自定义的反序列化器,要么需要在com.fasterxml.jackson.databind.jsonMappingException.from

  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 我明白它无法从嵌套JSON反序列化字符串。我解决这个问题的一个方法是通过编写自定义映射器 但是只要pojo中有变化,这就需要修改映射器,添加/删除字段。Mixin工作时没有任何变化,我该如何更新我的Mixin来处理objectId呢?

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 首先,我不熟悉Jython。我正在寻找一种将python代码集成到Java项目中的方法。因此我正在调查Jython。 我正在尝试将一个 json 字符串转换为 Java 对象 - 在 python 中。 首先,我一直在努力让Jython找到我的java类。由于缺乏更优雅的解决方案,我可以通过简单地执行以下操作来向前迈进: 无论如何。。。 我正在尝试以下操作: 但是,在运行时,我收到以下错误: 我不