Skip to content

Commit 25b0353

Browse files
committed
fix(azure): parse metadata JSON into mutable Map before injecting distance
Avoid UnsupportedOperationException by ensuring metadata is always a LinkedHashMap. Add `parseMetadataToMutable` helper and use it in similarity search path. Relates to #4117 Signed-off-by: Jinwoo Lee <[email protected]>
1 parent ecc3317 commit 25b0353

File tree

1 file changed

+17
-4
lines changed
  • vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure

1 file changed

+17
-4
lines changed

vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.Collections;
21+
import java.util.LinkedHashMap;
2122
import java.util.List;
2223
import java.util.Map;
2324
import java.util.Optional;
@@ -239,10 +240,7 @@ public List<Document> doSimilaritySearch(SearchRequest request) {
239240

240241
final AzureSearchDocument entry = result.getDocument(AzureSearchDocument.class);
241242

242-
Map<String, Object> metadata = (StringUtils.hasText(entry.metadata()))
243-
? JSONObject.parseObject(entry.metadata(), new TypeReference<>() {
244-
245-
}) : Map.of();
243+
Map<String, Object> metadata = parseMetadataToMutable(entry.metadata());
246244

247245
metadata.put(DocumentMetadata.DISTANCE.value(), 1.0 - result.getScore());
248246

@@ -325,6 +323,21 @@ public <T> Optional<T> getNativeClient() {
325323
return Optional.of(client);
326324
}
327325

326+
static Map<String, Object> parseMetadataToMutable(@Nullable String metadataJson) {
327+
if (!StringUtils.hasText(metadataJson)) {
328+
return new LinkedHashMap<>();
329+
}
330+
try {
331+
Map<String, Object> parsed = JSONObject.parseObject(metadataJson, new TypeReference<Map<String, Object>>() {
332+
});
333+
return (parsed == null) ? new LinkedHashMap<>() : new LinkedHashMap<>(parsed);
334+
}
335+
catch (Exception ex) {
336+
logger.warn("Failed to parse metadata JSON. Using empty metadata. json={}", metadataJson, ex);
337+
return new LinkedHashMap<>();
338+
}
339+
}
340+
328341
public record MetadataField(String name, SearchFieldDataType fieldType) {
329342

330343
public static MetadataField text(String name) {

0 commit comments

Comments
 (0)