{"record":{"id":"1072ab5f2da5ebf4","repo":"spring-projects/spring-ai","slug":"unsupported-qdrant-value-type","errorCode":null,"errorMessage":"Unsupported Qdrant value type: ","messagePattern":"Unsupported Qdrant value type: ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java","lineNumber":83,"sourceCode":"\n\t\tif (value instanceof Map) {\n\t\t\treturn value((Map<String, @Nullable Object>) value);\n\t\t}\n\n\t\tif (value instanceof List) {\n\t\t\treturn value((List<Object>) value);\n\t\t}\n\n\t\treturn switch (value.getClass().getSimpleName()) {\n\t\t\tcase \"String\" -> ValueFactory.value((String) value);\n\t\t\tcase \"Integer\" -> ValueFactory.value((Integer) value);\n\t\t\tcase \"Long\" ->\n\t\t\t\t// use String representation\n\t\t\t\tValueFactory.value(String.valueOf(value));\n\t\t\tcase \"Double\" -> ValueFactory.value((Double) value);\n\t\t\tcase \"Float\" -> ValueFactory.value((Float) value);\n\t\t\tcase \"Boolean\" -> ValueFactory.value((Boolean) value);\n\t\t\tdefault -> throw new IllegalArgumentException(\"Unsupported Qdrant value type: \" + value.getClass());\n\t\t};\n\t}\n\n\tprivate static Value value(List<Object> elements) {\n\t\tList<Value> values = new ArrayList<>(elements.size());\n\n\t\tfor (Object element : elements) {\n\t\t\tvalues.add(value(element));\n\t\t}\n\n\t\treturn ValueFactory.list(values);\n\t}\n\n\tprivate static Value value(Object[] elements) {\n\t\tList<Value> values = new ArrayList<>(elements.length);\n\n\t\tfor (Object element : elements) {\n\t\t\tvalues.add(value(element));","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java#L65-L101","documentation":"QdrantValueFactory.value(Object) maps a Java value into a Qdrant protobuf Value and only supports String, Integer/Long (as string), Double, Float, and Boolean plus lists. Any other type hits the default branch and throws IllegalArgumentException 'Unsupported Qdrant value type: <class>'. This guards the mapping layer from values Qdrant's protocol cannot represent.","triggerScenarios":"Storing document metadata whose value is a type like LocalDate, BigDecimal, byte[], Map, or a custom POJO when adding documents to QdrantVectorStore.","commonSituations":"Passing raw domain objects (dates, enums, UUIDs, BigDecimal) into Document metadata; upgrading code where metadata previously held only primitives; JSON-deserialized metadata containing nested objects.","solutions":["Convert unsupported types to supported ones before adding metadata: LocalDate.toString(), enum.name(), uuid.toString()","Replace BigDecimal/BigInteger with Double or its String form","Flatten nested Maps into string (JSON) or list-of-scalars form","Normalize metadata centrally in one helper before constructing Documents"],"exampleFix":"// before\nmetadata.put(\"created\", LocalDate.now());\n// after\nmetadata.put(\"created\", LocalDate.now().toString());","handlingStrategy":"type-guard","validationCode":"Set<Class<?>> ok = Set.of(String.class, Integer.class, Long.class, Double.class, Float.class, Boolean.class); metadata.values().forEach(v -> { if (!ok.contains(v.getClass()) && !(v instanceof List)) throw new IllegalArgumentException(\"Unsupported metadata type: \" + v.getClass()); });","typeGuard":"static boolean isQdrantValue(Object v) { return v instanceof String || v instanceof Integer || v instanceof Long || v instanceof Double || v instanceof Float || v instanceof Boolean || v instanceof List; }","tryCatchPattern":"try { vectorStore.add(docs); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"Unsupported Qdrant value type\")) { /* normalize metadata */ } else throw e; }","preventionTips":["Normalize metadata to primitives/Strings in one helper before creating Documents","Convert dates, UUIDs, enums, BigDecimal to String","Flatten or JSON-encode nested structures"],"tags":["qdrant","metadata","value-conversion","vector-store","spring-ai"],"backgroundTag":"type-mismatch","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}