{"record":{"id":"647768a55bb2660e","repo":"apache/shenyu","slug":"the-plugin-of-namespace-is-exist","errorCode":null,"errorMessage":"The plugin of namespace is exist！","messagePattern":"The plugin of namespace is exist！","errorType":"validation","errorClass":"ShenyuAdminException","httpStatus":null,"severity":"error","filePath":"shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/NamespacePluginServiceImpl.java","lineNumber":97,"sourceCode":"        this.selectorMapper = selectorMapper;\n        this.pluginHandleMapper = pluginHandleMapper;\n    }\n    \n    @Override\n    public NamespacePluginVO findById(final String id) {\n        return namespacePluginRelMapper.selectById(id);\n    }\n    \n    @Override\n    public NamespacePluginVO findByNamespaceIdAndPluginId(final String namespaceId, final String pluginId) {\n        return namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginId, namespaceId);\n    }\n    \n    @Override\n    public NamespacePluginVO create(final String namespaceId, final String pluginId) {\n        NamespacePluginVO existNamespacePluginVO = namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginId, namespaceId);\n        if (Objects.nonNull(existNamespacePluginVO)) {\n            throw new ShenyuAdminException(AdminConstants.NAMESPACE_PLUGIN_EXIST);\n        }\n        PluginDO pluginDO = pluginMapper.selectById(pluginId);\n        NamespacePluginRelDO namespacePluginRelDO = NamespacePluginRelDO.buildNamespacePluginRelDO(pluginDO, namespaceId);\n        namespacePluginRelMapper.insertSelective(namespacePluginRelDO);\n        return namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginId, namespaceId);\n    }\n    \n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public String update(final NamespacePluginDTO namespacePluginDTO) {\n        final NamespacePluginVO before = namespacePluginRelMapper.selectById(namespacePluginDTO.getId());\n        NamespacePluginRelDO namespacePluginRelDO = NamespacePluginRelDO.buildNamespacePluginRelDO(namespacePluginDTO);\n        if (namespacePluginRelMapper.updateSelective(namespacePluginRelDO) > 0) {\n            final NamespacePluginVO now = namespacePluginRelMapper.selectById(namespacePluginDTO.getId());\n            // publish update event.\n            namespacePluginEventPublisher.onUpdated(now, before);\n        }\n        return ShenyuResultMessage.UPDATE_SUCCESS;","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/apache/shenyu/blob/567142e07261b3e615ae8850b30f4421f455cc5d/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/NamespacePluginServiceImpl.java#L79-L115","documentation":"Thrown by NamespacePluginServiceImpl.create when a plugin-to-namespace relation already exists for the given pluginId and namespaceId. Each plugin can be enabled in a namespace only once, so a duplicate insert is rejected with AdminConstants.NAMESPACE_PLUGIN_EXIST.","triggerScenarios":"Calling POST /namespace-plugin to enable a plugin in a namespace where it is already enabled; double-clicking/retrying the enable action in the dashboard; concurrent requests racing past the selectByPluginIdAndNamespaceId existence check.","commonSituations":"Re-running an initialization script that binds default plugins to a namespace; UI state out of sync after another admin enabled the plugin; API scripts without idempotency checks.","solutions":["Check existing bindings first via the namespace-plugin list API for that namespaceId/pluginId","Make the enable operation idempotent: skip creation when the relation already exists","Treat the existing relation as success and return it instead of inserting","Serialize/rate-limit duplicate requests from UI clients"],"exampleFix":"// before\nnamespacePluginService.create(namespaceId, pluginId);\n// after\nif (namespacePluginService.findByPluginIdAndNamespaceId(pluginId, namespaceId) == null) {\n    namespacePluginService.create(namespaceId, pluginId);\n}","handlingStrategy":"validation","validationCode":"NamespacePluginVO existing = namespacePluginRelMapper.selectByPluginIdAndNamespaceId(pluginId, namespaceId);\nif (existing != null) {\n    return existing;\n}","typeGuard":null,"tryCatchPattern":"try {\n    namespacePluginService.create(namespaceId, pluginId);\n} catch (ShenyuAdminException e) {\n    if (AdminConstants.NAMESPACE_PLUGIN_EXIST.equals(e.getMessage())) {\n        LOG.info(\"plugin {} already bound to namespace {}\", pluginId, namespaceId);\n    } else {\n        throw e;\n    }\n}","preventionTips":["Check existing plugin-namespace bindings before enabling","Make enable scripts idempotent","Avoid duplicate submissions from UI clients"],"tags":["shenyu","admin","duplicate","namespace-plugin"],"backgroundTag":"file-already-exists","analyzedSha":"567142e07261b3e615ae8850b30f4421f455cc5d","analyzedAt":"2026-09-12T10:08:21.293Z","contentChangedAt":"2026-09-12T10:08:21.293Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}