{"record":{"id":"9afe54f72bb6c3a3","repo":"alibaba/nacos","slug":"data-access-error","errorCode":"DATA_ACCESS_ERROR","errorMessage":"AI resource import plugin returned null service: {}","messagePattern":"AI resource import plugin returned null service: (.+?)","errorType":"exception","errorClass":"NacosApiException","httpStatus":500,"severity":"error","filePath":"ai/src/main/java/com/alibaba/nacos/ai/importer/manager/AiResourceImportManager.java","lineNumber":311,"sourceCode":"    private int resolveMaxItemCount(AiResourceImportServiceBuilder builder) {\n        String value =\n            builder.getCurrentConfig().get(AiResourceImportConstants.CONFIG_MAX_ITEM_COUNT);\n        return StringUtils.isBlank(value) ? AiResourceImportConstants.DEFAULT_MAX_ITEM_COUNT\n            : Integer.parseInt(value);\n    }\n    \n    private long resolveMaxArtifactSize(AiResourceImportServiceBuilder builder) {\n        String value =\n            builder.getCurrentConfig().get(AiResourceImportConstants.CONFIG_MAX_ARTIFACT_SIZE);\n        return StringUtils.isBlank(value) ? AiResourceImportConstants.DEFAULT_MAX_ARTIFACT_SIZE\n            : Long.parseLong(value);\n    }\n    \n    private AiResourceImportService buildImporter(AiResourceImportServiceBuilder builder)\n        throws NacosException {\n        AiResourceImportService result = builder.build();\n        if (result == null) {\n            throw new NacosApiException(NacosException.SERVER_ERROR,\n                ErrorCode.DATA_ACCESS_ERROR,\n                \"AI resource import plugin returned null service: \" + builder.pluginName());\n        }\n        return result;\n    }\n    \n    private void closeImporter(AiResourceImportServiceBuilder builder,\n        AiResourceImportService importer, String operation) {\n        if (importer == null) {\n            return;\n        }\n        try {\n            importer.close();\n        } catch (RuntimeException e) {\n            LOGGER.warn(\"Failed to close AI resource import service, pluginName={}, operation={}\",\n                builder == null ? null : builder.pluginName(), operation, e);\n        }\n    }","sourceCodeStart":293,"sourceCodeEnd":329,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/ai/src/main/java/com/alibaba/nacos/ai/importer/manager/AiResourceImportManager.java#L293-L329","documentation":"Thrown by AiResourceImportManager.buildImporter() when an AiResourceImportServiceBuilder SPI implementation's build() method returns null. This is a plugin-author defect, not a caller error: the builder advertised itself via SPI but failed to produce a service instance. It is mapped to DATA_ACCESS_ERROR with a SERVER_ERROR top-level code because the server cannot proceed with a usable importer.","triggerScenarios":"Any AI resource import operation (search, validate, execute) that resolves a managed plugin whose builder.build() returns null. Happens immediately after resolveBuilder succeeds and before any external source is contacted.","commonSituations":"A custom AiResourceImportServiceBuilder whose build() short-circuits on missing internal state (e.g. credentials not injected, downstream client constructor threw and was swallowed); a third-party plugin jar on the classpath that is partially implemented; a plugin built against an older API where build() was allowed to return null.","solutions":["Fix the offending AiResourceImportServiceBuilder so build() never returns null (throw a descriptive NacosException instead of returning null).","If you do not own the plugin, remove or disable it via the plugin state checker so resolveBuilder rejects it earlier.","Check the server log for the pluginName in the message and verify the corresponding SPI jar is the intended version and is fully initialized."],"exampleFix":"// before (in your AiResourceImportServiceBuilder)\npublic AiResourceImportService build() {\n    if (client == null) {\n        return null; // triggers DATA_ACCESS_ERROR\n    }\n    return new MyImportService(client);\n}\n\n// after\npublic AiResourceImportService build() throws NacosException {\n    if (client == null) {\n        throw new NacosException(NacosException.SERVER_ERROR,\n            \"MyImport client not initialized for plugin \" + pluginName());\n    }\n    return new MyImportService(client);\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    manager.search(request);\n} catch (NacosApiException e) {\n    if (ErrorCode.DATA_ACCESS_ERROR.getCode() == e.getDetailErrCode()\n        && e.getErrMsg().contains(\"returned null service\")) {\n        // plugin defect: disable source and alert the plugin owner\n        log.error(\"Import plugin {} is broken, returning null service\", sourceId, e);\n    }\n    throw e;\n}","preventionTips":["In your own AiResourceImportServiceBuilder, never return null from build(); throw a descriptive NacosException instead.","Add a unit test asserting build() returns a non-null service for all builder configurations.","During plugin rollout, call listSources first; a builder that throws on build will only fail on first use, so smoke-test search against each plugin."],"tags":["ai","importer","plugin","spi","server-error"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}