{"record":{"id":"2d79d7aff6611914","repo":"alibaba/nacos","slug":"resource-not-found-2d79d7","errorCode":"RESOURCE_NOT_FOUND","errorMessage":"Plugin not found: %s","messagePattern":"Plugin not found: (.+?)","errorType":"http","errorClass":"NacosApiException","httpStatus":404,"severity":"warning","filePath":"console/src/main/java/com/alibaba/nacos/console/handler/impl/inner/core/PluginInnerHandler.java","lineNumber":173,"sourceCode":"        throws NacosException {\n        String pluginId = pluginType + \":\" + pluginName;\n        pluginManager.setPluginEnabled(pluginId, enabled, localOnly);\n    }\n    \n    @Override\n    public void updatePluginConfig(String pluginType, String pluginName, Map<String, String> config,\n        boolean localOnly) throws NacosException {\n        String pluginId = pluginType + \":\" + pluginName;\n        pluginManager.updatePluginConfig(pluginId, config, localOnly);\n    }\n    \n    @Override\n    public Map<String, Boolean> getPluginAvailability(String pluginType, String pluginName)\n        throws NacosException {\n        String pluginId = pluginType + \":\" + pluginName;\n        \n        if (!pluginManager.isPluginAvailable(pluginId)) {\n            throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.RESOURCE_NOT_FOUND,\n                \"Plugin not found: \" + pluginId);\n        }\n        \n        Collection<Member> members = memberManager.allMembers();\n        Map<String, Boolean> nodeAvailability = new ConcurrentHashMap<>(members.size());\n        \n        List<CompletableFuture<Void>> futures = members.stream()\n            .map(member -> CompletableFuture.runAsync(() -> {\n                String address = member.getAddress();\n                nodeAvailability.put(address, checkMemberPluginAvailability(member, pluginId));\n            }))\n            .collect(Collectors.toList());\n        \n        awaitCompletion(futures);\n        \n        return nodeAvailability;\n    }\n    ","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/console/src/main/java/com/alibaba/nacos/console/handler/impl/inner/core/PluginInnerHandler.java#L155-L191","documentation":"Thrown by PluginInnerHandler.getPluginAvailability when pluginManager.isPluginAvailable(pluginId) returns false for the given pluginType:pluginName. It raises NacosApiException with HTTP 404 and ErrorCode.RESOURCE_NOT_FOUND. Note the message says 'not found' but the guard is availability: a plugin that is registered but not currently available on this node also triggers it.","triggerScenarios":"Querying cluster-wide availability for a pluginId that is not loaded/available on the node handling the request (plugin not installed, disabled, or wrong type:name combination).","commonSituations":"Typo in pluginType or pluginName; querying a plugin whose SPI implementation is not on the classpath; plugin disabled in config; querying before the plugin manager initialized the plugin.","solutions":["Confirm pluginType and pluginName exactly match a loaded plugin (use the plugin list endpoint to enumerate valid ids).","Ensure the plugin's SPI jar/implementation is present and enabled on all cluster nodes.","If the plugin was just installed, verify it is initialized before querying availability."],"exampleFix":"// before\nhandler.getPluginAvailability(\"auth\", \"nonexistent\");\n\n// after\nCollection<String> ids = pluginManager.getAllPlugins(); // enumerate real ids\nString validId = ids.stream().filter(id -> id.startsWith(\"auth:\")).findFirst().orElseThrow();\nhandler.getPluginAvailability(\"auth\", validId.split(\":\")[1]);","handlingStrategy":"validation","validationCode":"// Confirm the pluginId is available before querying cluster availability\nString pluginId = pluginType + \":\" + pluginName;\nif (!pluginManager.isPluginAvailable(pluginId)) {\n    throw new NoSuchResourceException(\"plugin not available: \" + pluginId);\n}\nhandler.getPluginAvailability(pluginType, pluginName);","typeGuard":"// Java: boolean guard for a loaded/available plugin\nboolean pluginAvailable = pluginManager.isPluginAvailable(pluginType + \":\" + pluginName);","tryCatchPattern":"try {\n    return handler.getPluginAvailability(pluginType, pluginName);\n} catch (NacosApiException e) {\n    if (e.getDetailErrCode() == ErrorCode.RESOURCE_NOT_FOUND.getCode()) {\n        return Map.of(); // plugin absent cluster-wide\n    }\n    throw e;\n}","preventionTips":["Enumerate valid plugin ids from the plugin list before querying availability.","Ensure the plugin SPI jar is present on every cluster node.","Verify the plugin is enabled/initialized before availability checks."],"tags":["plugin","not-found","console","cluster"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}