microsoftgraph / microsoftgraph/msgraph-sdk-java

SDK NullPointerException due to missing @odata.type field during select query

未關閉
#2,587 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

status:waiting-for-triage type:bug
主要語言
Java
星號
444
分支
154
平均合併
18 小時 28 分鐘
30 天內合併 PR
4

描述

Describe the bug

During a select query for users, mapping them to the User class fails with following NPE

java.lang.NullPointerException: parameter node cannot be null
	at java.util.Objects.requireNonNull(Objects.java:246)
	at io.kiota.serialization.json.JsonParseNode.<init>(JsonParseNode.java:38)
	at io.kiota.serialization.json.JsonParseNodeFactory.createJsonParseNode(JsonParseNodeFactory.java:32)
	at io.kiota.serialization.json.JsonParseNode.getChildNode(JsonParseNode.java:48)
	at com.microsoft.graph.models.User.createFromDiscriminatorValue(User.java:30)
	at io.kiota.serialization.json.JsonParseNode.getObjectValue(JsonParseNode.java:248)
	at io.kiota.serialization.json.JsonParseNode.getCollectionOfObjectValues(JsonParseNode.java:219)
	at com.microsoft.graph.models.UserCollectionResponse.lambda$getFieldDeserializers$0(UserCollectionResponse.java:34)
	at io.kiota.serialization.json.JsonParseNode.assignFieldValues(JsonParseNode.java:301)
	at io.kiota.serialization.json.JsonParseNode.getObjectValue(JsonParseNode.java:249)
	at com.microsoft.kiota.http.OkHttpRequestAdapter.send(OkHttpRequestAdapter.java:322)
	at com.microsoft.graph.groups.item.members.graphuser.GraphUserRequestBuilder.get(GraphUserRequestBuilder.java:70)
Expected behavior

The user(s) should be selected by the query, mapped and returned in a response object

How to reproduce

Code snippet to reproduce:

final String groupId = "test group id";
final GraphUserRequestBuilder request = client.groups()
                .byGroupId(groupId)
                .members()
                .graphUser()
                .get(req -> {
                    req.queryParameters.select = "id,name,mail";
                    req.queryParameters.filter = "id in (1,2,3)";
                    req.queryParameters.count = true;
                    req.headers.add("ConsistencyLevel", "eventual");
                    }
                })

Code snippet to reproduce the NPE with the JsonNode

import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.kiota.serialization.json.JsonParseNode;
import io.kiota.serialization.json.JsonParseNodeFactory;

class Scratch {
    static void main() {
        try {
            var a = new JsonParseNode(new JsonParseNodeFactory(), new ObjectNode(new JsonNodeFactory(false)));
            var b = a.getChildNode("@odata.type");
        } catch (NullPointerException e) {
            System.out.println("Exception!");
        }
    }
}

Replicating this code in Graph UI returns following example response:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users(id,name,mail)",
    "@odata.count": 2,
    "value": [
        {
            "id": "id 1",
            "name": "name 1",
            "mail": "mail 1"
        },
        {
            "id": "id 2",
            "name": "name 2",
            "mail": "mail 2"
        }
    ]
}

Which then leads to the NPE as the SDK is expecting @odata.type field being set here

https://github.com/microsoftgraph/msgraph-sdk-java/blob/main/src/main/java/com/microsoft/graph/generated/models/User.java

@jakarta.annotation.Nonnull
    public static User createFromDiscriminatorValue(@jakarta.annotation.Nonnull final ParseNode parseNode) {
        Objects.requireNonNull(parseNode);
        final ParseNode mappingValueNode = parseNode.getChildNode("@odata.type"); <- NPE being caused here
        if (mappingValueNode != null) {
            final String mappingValue = mappingValueNode.getStringValue();
            switch (mappingValue) {
                case "#microsoft.graph.agentUser": return new AgentUser();
            }
        }
        return new User();
    }
SDK Version

6.63.0

Latest version known to work for scenario above?

6.62.0

Known Workarounds

No response

Debug output
Click to expand log ```
</details>


### Configuration

_No response_

### Other information

_No response_

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

從 src/main/java/com/microsoft/graph/generated/models/User.java 中的 User.createFromDiscriminatorValue 開始,追蹤遺失的 @odata.type 欄位對應的 JsonParseNode.getChildNode。使用提供的 select 查詢或 JsonNode 片段重現問題,然後驗證僅包含 id、name 和 mail 的使用者能夠在不發生 NullPointerException 的情況下完成對映並返回。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
java
領域
api
Issue 類型
缺陷
難度
3/5
預估耗時
1-2 天
活躍度
冷清
描述清晰度
基本清楚
新手友好度
68/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。