Optional type fields throw NPE when deserializing null values

未关闭
#758 5 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

维护者通常 1 天内回复

@hemasekhar-p 已经在做这个了。

开始于 2026年1月7日。

  • #1362 来自 @copybara-service —— 未关闭

评估

这个 Issue 还没有评估数据。

描述

priority: p2 type: bug

When API response contains a field with a null value, and the corresponding field in the SDK entity class is defined as type Optional, a NullPointerExceptionis thrown during JSON deserialization.

Call Vertex AI:

GenerateContentResponse response =
            client.models.generateContent("gemini-2.5-flash", "What is your name?", null);

Here is the response body, inlineData is one of null fields:

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": "I am a large language model, trained by Google.",
            "inlineData": null,
            "functionCall": null,
            "functionResponse": null,
            "executableCode": null,
            "codeExecutionResult": null
          }
        ]
      },
      "finishReason": "STOP",
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE",
          "blocked": null
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "NEGLIGIBLE",
          "blocked": null
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE",
          "blocked": null
        },
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE",
          "blocked": null
        }
      ],
      "citationMetadata": null,
      "tokenCount": null,
      "groundingAttributions": null,
      "groundingMetadata": null,
      "index": null
    }
  ],
  "modelVersion": "gemini-2.0-flash-001",
  "promptFeedback": null,
  "usageMetadata": {
    "promptTokenCount": 4,
    "cachedContentTokenCount": null,
    "candidatesTokenCount": 12,
    "toolUsePromptTokenCount": null,
    "thoughtsTokenCount": null,
    "totalTokenCount": 16,
    "promptTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 4
      }
    ],
    "cacheTokensDetails": null,
    "candidatesTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 12
      }
    ],
    "toolUsePromptTokensDetails": null
  }
}

When the response returns and begins parsing, the following exception is thrown:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: N/A
 at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: com.google.genai.Test$MockResponse["candidates"]->java.util.ArrayList[0]->com.google.genai.Test$Candidate["content"]->com.google.genai.Test$Content["parts"]->java.util.ArrayList[0]->com.google.genai.types.AutoValue_Part$Builder["inlineData"])
	at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:275)
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:649)
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:637)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:173)
	at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.vanillaDeserialize(BuilderBasedDeserializer.java:294)
	at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserialize(BuilderBasedDeserializer.java:218)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:360)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:29)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:302)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:169)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:302)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:169)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:360)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:29)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:302)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:169)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342)
	at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4944)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3055)
	at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3519)
	at com.google.genai.JsonSerializable.fromJsonNode(JsonSerializable.java:173)
	... 1 more
Caused by: java.lang.NullPointerException
	at java.base/java.util.Objects.requireNonNull(Objects.java:209)
	at java.base/java.util.Optional.of(Optional.java:113)
	at com.google.genai.types.AutoValue_Part$Builder.inlineData(AutoValue_Part.java:302)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:170)
	... 23 more

The reason is that Optional.of requires nonnull parameter:

Image
主要语言
Java
星标
398
派生
126
平均合并
1 天 12 小时
30 天内合并 PR
71

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

googleapis/java-genai 的其他 Issue

查看 googleapis/java-genai 的全部 Issue

相似的 Issue

更多 Java Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。