Skip to content

Commit c92e299

Browse files
Jiakaicclaude
andcommitted
fix: safely handle null pointers in thread API message processing
Added Optional chain for safe content extraction from OpenAI thread messages. This prevents NullPointerException when message content, text, or value is null. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 40b68ab commit c92e299

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

api/src/main/java/com/ke/bella/workflow/api/DifyController.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.ke.bella.workflow.api;
22

3+
import java.time.LocalDateTime;
34
import java.time.ZoneId;
45
import java.util.ArrayList;
56
import java.util.Collections;
@@ -18,13 +19,11 @@
1819

1920
import javax.servlet.http.HttpServletRequest;
2021

21-
import java.time.LocalDateTime;
2222
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.format.annotation.DateTimeFormat;
2324
import org.springframework.util.Assert;
2425
import org.springframework.util.CollectionUtils;
2526
import org.springframework.util.StringUtils;
26-
import org.springframework.format.annotation.DateTimeFormat;
27-
import org.springframework.http.ResponseEntity;
2827
import org.springframework.web.bind.annotation.GetMapping;
2928
import org.springframework.web.bind.annotation.PathVariable;
3029
import org.springframework.web.bind.annotation.PostMapping;
@@ -79,7 +78,9 @@
7978
import com.ke.bella.workflow.utils.JsonUtils;
8079
import com.ke.bella.workflow.utils.OpenAiUtils;
8180
import com.theokanning.openai.assistants.message.Message;
81+
import com.theokanning.openai.assistants.message.MessageContent;
8282
import com.theokanning.openai.assistants.message.MessageListSearchParameters;
83+
import com.theokanning.openai.assistants.message.content.Text;
8384
import com.theokanning.openai.service.OpenAiService;
8485

8586
import lombok.AllArgsConstructor;
@@ -650,12 +651,28 @@ public Page<DifyChatFlowRun> pageChatFlowRuns(@PathVariable String workflowId,
650651
}
651652

652653
for (List<Message> groupedMessage : groupedMessages) {
654+
String query = Optional.ofNullable(groupedMessage.get(0).getContent())
655+
.filter(content -> !content.isEmpty())
656+
.map(content -> content.get(0))
657+
.map(MessageContent::getText)
658+
.map(Text::getValue)
659+
.orElse("");
660+
661+
String answer = groupedMessage.subList(1, groupedMessage.size()).stream()
662+
.map(e -> Optional.ofNullable(e.getContent())
663+
.filter(content -> !content.isEmpty())
664+
.map(content -> content.get(0))
665+
.map(MessageContent::getText)
666+
.map(Text::getValue)
667+
.orElse(""))
668+
.filter(Objects::nonNull)
669+
.collect(Collectors.joining());
670+
653671
DifyChatFlowRun run = DifyChatFlowRun.builder()
654672
.id(groupedMessage.get(0).getId())
655673
.conversation_id(groupedMessage.get(0).getThreadId())
656-
.query(groupedMessage.get(0).getContent().get(0).getText().getValue())
657-
.answer(groupedMessage.subList(1, groupedMessage.size()).stream().map(e -> e.getContent().get(0).getText().getValue())
658-
.collect(Collectors.joining()))
674+
.query(query)
675+
.answer(answer)
659676
.created_at((long) groupedMessage.get(0).getCreatedAt())
660677
.workflow_run_id(Optional.ofNullable(groupedMessage.get(0).getMetadata()).map(e -> e.get("workflowRunId")).orElse(null))
661678
.build();

0 commit comments

Comments
 (0)