{"record":{"id":"1bf2722f3ded3849","repo":"jd-opensource/joyagent-jdgenie","slug":"collectionname-is-empty","errorCode":null,"errorMessage":"collectionName is empty","messagePattern":"collectionName is empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"genie-backend/src/main/java/com/jd/genie/service/QdrantService.java","lineNumber":84,"sourceCode":"        if (client == null) {\n            if (StringUtils.isNotBlank(dataAgentConfig.getQdrantConfig().getApiKey())) {\n                client = new QdrantClient(QdrantGrpcClient.newBuilder(dataAgentConfig.getQdrantConfig().getHost(), dataAgentConfig.getQdrantConfig().getPort(), false).withApiKey(dataAgentConfig.getQdrantConfig().getApiKey()).build());\n            } else {\n                client = new QdrantClient(QdrantGrpcClient.newBuilder(dataAgentConfig.getQdrantConfig().getHost(), dataAgentConfig.getQdrantConfig().getPort(), false).build());\n            }\n        }\n    }\n\n    @Override\n    public void destroy() {\n        if (client != null) {\n            client.close();\n        }\n    }\n\n    public List<Points.ScoredPoint> search(String collectionName, List<Float> vector, int limit, Points.Filter filter, List<String> payloads, Long timeout, TimeUnit timeUnit, Float scoreThreshold) throws ExecutionException, InterruptedException, TimeoutException {\n        if (StringUtils.isBlank(collectionName)) {\n            throw new IllegalArgumentException(\"collectionName is empty\");\n        }\n        if (CollectionUtils.isEmpty(vector)) {\n            throw new IllegalArgumentException(\"vector is empty\");\n        }\n        Points.SearchPoints.Builder requestBuilder = Points.SearchPoints.newBuilder();\n        requestBuilder.setCollectionName(collectionName);\n        requestBuilder.addAllVector(vector);\n        requestBuilder.setLimit(Math.min(limit, maxLimitSize));\n        if (Objects.nonNull(payloads)) {\n            requestBuilder.setWithPayload(include(payloads));\n        } else {\n            requestBuilder.setWithPayload(enable(true));\n        }\n        if (Objects.nonNull(filter)) {\n            requestBuilder.setFilter(filter);\n        }\n\n        if (Objects.nonNull(scoreThreshold)) {","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/jd-opensource/joyagent-jdgenie/blob/2417e0b8b636d941ad5fb14c59b20dddfef5375d/genie-backend/src/main/java/com/jd/genie/service/QdrantService.java#L66-L102","documentation":"QdrantService.search validates its arguments before issuing a gRPC SearchPoints request to the Qdrant vector database. A blank collectionName cannot address any collection, so it throws IllegalArgumentException(\"collectionName is empty\") immediately.","triggerScenarios":"Calling search(collectionName, vector, ...) with null, empty, or whitespace-only collectionName — typically a null/blank config property or a value derived from an unset upstream variable.","commonSituations":"Missing qdrant collection config key in application.yml; environment variable not set in the deployment; code path constructs collection name by concatenation that yields empty string.","solutions":["Log and inspect the caller to find where the blank collectionName comes from","Set the collection name in configuration (e.g. qdrant.collection) and inject it","Add an upfront guard/default so callers never pass a blank name"],"exampleFix":"// before\nqdrantService.search(config.getCollectionName(), vector, 10, null, null, 5L, TimeUnit.SECONDS, 0.7f);\n// after\nAssert.hasText(config.getCollectionName(), \"qdrant collection name must be configured\");\nqdrantService.search(config.getCollectionName(), vector, 10, null, null, 5L, TimeUnit.SECONDS, 0.7f);","handlingStrategy":"validation","validationCode":"if (collectionName == null || collectionName.isBlank()) {\n    throw new IllegalArgumentException(\"collectionName must be non-blank\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    List<Points.ScoredPoint> hits = qdrantService.search(collectionName, vector, limit, filter, payloads, timeout, unit, scoreThreshold);\n} catch (IllegalArgumentException e) {\n    log.error(\"Invalid qdrant search argument: {}\", e.getMessage());\n    return Collections.emptyList();\n}","preventionTips":["Externalize the collection name in configuration and validate it at startup","Never build collection names by concatenation without a blank check","Log the collection name (not secrets) before each search call during debugging"],"tags":["java","qdrant","validation","vector-database"],"backgroundTag":"empty-required-field","analyzedSha":"2417e0b8b636d941ad5fb14c59b20dddfef5375d","analyzedAt":"2026-09-08T11:28:19.414Z","contentChangedAt":"2026-09-08T11:28:19.414Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}