alibaba/nacos · error · NacosException
404
404
Error message
service %s@@%s is not found!
What it means
Thrown by CatalogServiceV2Impl.getServiceDetail when the requested service does not exist in the ServiceManager singleton registry. Error code is NOT_FOUND=404. The check uses ServiceManager.getInstance().containSingleton(service) which verifies the service has been registered/loaded on this server.
Source
Thrown at naming/src/main/java/com/alibaba/nacos/naming/core/CatalogServiceV2Impl.java:75
public class CatalogServiceV2Impl implements CatalogService {
private final ServiceStorage serviceStorage;
private final NamingMetadataManager metadataManager;
public CatalogServiceV2Impl(ServiceStorage serviceStorage,
NamingMetadataManager metadataManager) {
this.serviceStorage = serviceStorage;
this.metadataManager = metadataManager;
}
@Override
public ServiceDetailInfo getServiceDetail(String namespaceId, String groupName,
String serviceName)
throws NacosException {
Service service = Service.newService(namespaceId, groupName, serviceName);
if (!ServiceManager.getInstance().containSingleton(service)) {
throw new NacosException(NacosException.NOT_FOUND,
String.format("service %s@@%s is not found!", groupName, serviceName));
}
service = ServiceManager.getInstance().getSingleton(service);
Optional<ServiceMetadata> metadata = metadataManager.getServiceMetadata(service);
ServiceMetadata detailedService = metadata.orElseGet(ServiceMetadata::new);
ServiceDetailInfo result = new ServiceDetailInfo();
result.setNamespaceId(service.getNamespace());
result.setGroupName(service.getGroup());
result.setServiceName(serviceName);
result.setEphemeral(service.isEphemeral());
result.setProtectThreshold(detailedService.getProtectThreshold());
result.setSelector(detailedService.getSelector());
result.setMetadata(detailedService.getExtendData());
Map<String, ClusterInfo> clusters =
new HashMap<>(serviceStorage.getClusters(service).size());
for (String each : serviceStorage.getClusters(service)) {View on GitHub (pinned to 9b989acdf1)
Solutions
- Verify the service exists by listing services in the target namespace/group first.
- Check the namespaceId, groupName, and serviceName for typos.
- If the server recently restarted, wait for service data to finish loading from persistent storage.
- Register/publish the service if it was expected to exist.
Defensive patterns
Strategy: try-catch
Validate before calling
// verify service exists before fetching detail
if (!ServiceManager.getInstance().containSingleton(
Service.newService(namespaceId, groupName, serviceName))) {
log.warn("service does not exist: {}/{}", groupName, serviceName);
return;
} Try / catch
try {
ServiceDetailInfo detail = catalogService.getServiceDetail(namespaceId, groupName, serviceName);
} catch (NacosException e) {
if (e.getErrCode() == NacosException.NOT_FOUND) {
// service not registered; create it or inform user
} else { throw e; }
} Prevention
- List services in the target namespace/group before querying detail to confirm existence.
- Double-check namespaceId, groupName, and serviceName for typos.
- After a server restart, wait for service data to load before querying.
When it happens
Trigger: Calling the catalog service detail API (or the admin/console endpoint behind it) for a namespaceId/groupName/serviceName combination that has never been registered or has been removed.
Common situations: Querying a service that was never created. Service was deregistered/deleted between listing and detail lookup. Wrong namespace, group, or service name (typo). Querying a persistent service whose data has not yet loaded after a server restart.
Related errors
AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14).
Data as JSON: /api/errors/5ea7f85144151190.
Report an issue: GitHub.