{"record":{"id":"ec6d4fe3c2547994","repo":"apolloconfig/apollo","slug":"server-config-not-found-for-key-s-cluster-s","errorCode":null,"errorMessage":"server config not found for key:%s, cluster:%s","messagePattern":"server config not found for key:(.+?), cluster:(.+?)","errorType":"exception","errorClass":"NotFoundException","httpStatus":404,"severity":"error","filePath":"apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java","lineNumber":73,"sourceCode":"    if (Objects.isNull(storedConfig)) {// create\n      serverConfig.setId(0L);// 为空，设置ID 为0，jpa执行新增操作\n      return serverConfigRepository.save(serverConfig);\n    }\n\n    // update\n    storedConfig.setComment(serverConfig.getComment());\n    storedConfig.setDataChangeLastModifiedBy(serverConfig.getDataChangeLastModifiedBy());\n    storedConfig.setValue(serverConfig.getValue());\n\n    return serverConfigRepository.save(storedConfig);\n  }\n\n  @Transactional\n  public void deleteConfig(String key, String cluster, String operator) {\n    ServerConfig storedConfig = serverConfigRepository.findTopByKeyAndCluster(key, cluster);\n\n    if (Objects.isNull(storedConfig)) {\n      throw new NotFoundException(\"server config not found for key:%s, cluster:%s\", key, cluster);\n    }\n\n    storedConfig.setDeleted(true);\n    storedConfig.setDataChangeLastModifiedBy(operator);\n    serverConfigRepository.save(storedConfig);\n  }\n\n}\n","sourceCodeStart":55,"sourceCodeEnd":82,"githubUrl":"https://github.com/apolloconfig/apollo/blob/d95fc18d112589efc09ddcbe1507047584d55251/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ServerConfigService.java#L55-L82","documentation":"Thrown as NotFoundException (HTTP 404) by ServerConfigService.deleteConfig when no ServerConfig row matches the given (key, cluster). Server configs are stored per key+cluster; deleting a nonexistent combination yields 404.","triggerScenarios":"Calling deleteConfig(key, cluster, operator) for a server config key that was never created, was already soft-deleted, or whose cluster name is wrong.","commonSituations":"Deleting a server config that was already deleted (deleted=true rows are excluded from findTopByKeyAndCluster); typo in key/cluster; cleanup scripts targeting stale keys.","solutions":["Verify the config exists for (key, cluster) before deleting.","Make deletion idempotent: treat 404 as success in cleanup tooling.","Check the exact key spelling and cluster name against the ServerConfig table."],"exampleFix":"// before\nserverConfigService.deleteConfig(key, cluster, operator); // 404 if missing\n// after\nServerConfig cfg = serverConfigRepository.findTopByKeyAndCluster(key, cluster);\nif (cfg != null) {\n  serverConfigService.deleteConfig(key, cluster, operator);\n}","handlingStrategy":"validation","validationCode":"ServerConfig cfg = serverConfigRepository.findTopByKeyAndCluster(key, cluster);\nif (cfg != null) {\n  serverConfigService.deleteConfig(key, cluster, operator);\n}","typeGuard":null,"tryCatchPattern":"try {\n  serverConfigService.deleteConfig(key, cluster, operator);\n} catch (NotFoundException e) {\n  if (e.getMessage().contains(\"server config not found\")) {\n    // already absent — treat as success for idempotent cleanup\n  } else throw e;\n}","preventionTips":["Make server-config deletion idempotent.","Treat 404 as success in cleanup scripts."],"tags":["server-config","delete","not-found","apollo-biz","idempotency"],"backgroundTag":null,"analyzedSha":"d95fc18d112589efc09ddcbe1507047584d55251","analyzedAt":"2026-08-14T04:00:05.477Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}