{"record":{"id":"8034eeffe78e80bc","repo":"alibaba/nacos","slug":"invalid-param-8034ee","errorCode":"INVALID_PARAM","errorMessage":"Param 'serviceName' is illegal, serviceName is blank","messagePattern":"Param 'serviceName' is illegal, serviceName is blank","errorType":"validation","errorClass":"NacosException","httpStatus":null,"severity":"error","filePath":"naming/src/main/java/com/alibaba/nacos/naming/remote/rpc/handler/SubscribeServiceRequestHandler.java","lineNumber":85,"sourceCode":"        EphemeralClientOperationServiceImpl clientOperationService) {\n        this.serviceStorage = serviceStorage;\n        this.metadataManager = metadataManager;\n        this.clientOperationService = clientOperationService;\n    }\n    \n    @Override\n    @NamespaceValidation\n    @TpsControl(pointName = \"RemoteNamingServiceSubscribeUnSubscribe\",\n        name = \"RemoteNamingServiceSubscribeUnsubscribe\")\n    @Secured(action = ActionTypes.READ)\n    @ExtractorManager.Extractor(rpcExtractor = SubscribeServiceRequestParamExtractor.class)\n    public SubscribeServiceResponse handle(SubscribeServiceRequest request, RequestMeta meta)\n        throws NacosException {\n        String namespaceId = request.getNamespace();\n        String serviceName = request.getServiceName();\n        String groupName = request.getGroupName();\n        if (StringUtils.isBlank(serviceName)) {\n            throw new NacosException(NacosException.INVALID_PARAM,\n                \"Param 'serviceName' is illegal, serviceName is blank\");\n        }\n        if (StringUtils.isBlank(groupName)) {\n            throw new NacosException(NacosException.INVALID_PARAM,\n                \"Param 'groupName' is illegal, groupName is blank\");\n        }\n        String app = RequestContextHolder.getContext().getBasicContext().getApp();\n        String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);\n        Service service = Service.newService(namespaceId, groupName, serviceName, true);\n        Subscriber subscriber =\n            new Subscriber(meta.getClientIp(), meta.getClientVersion(), app, meta.getClientIp(),\n                namespaceId, groupedServiceName, 0, request.getClusters());\n        ServiceInfo serviceInfo =\n            ServiceUtil.selectInstancesWithHealthyProtection(serviceStorage.getData(service),\n                metadataManager.getServiceMetadata(service).orElse(null), subscriber.getCluster(),\n                false, true,\n                subscriber.getIp());\n        if (request.isSubscribe()) {","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/naming/src/main/java/com/alibaba/nacos/naming/remote/rpc/handler/SubscribeServiceRequestHandler.java#L67-L103","documentation":"Thrown by SubscribeServiceRequestHandler.handle() when a subscribe/unsubscribe gRPC request has a blank serviceName. The handler needs the service to subscribe to; a blank serviceName yields NacosException.INVALID_PARAM. Note this handler also enforces namespace via @NamespaceValidation before reaching this code.","triggerScenarios":"Client sends a SubscribeServiceRequest with an empty/null serviceName (groupName may be set).","commonSituations":"SDK subscribe call before serviceName is known; a watch-all misuse that passes an empty pattern; building the request from a null service object.","solutions":["Set a non-blank serviceName on the SubscribeServiceRequest.","Use the NamingService.subscribe(serviceName, ...) API which requires the name up front.","For pattern-based watching, use the fuzzy-watch API instead of subscribe with a blank name."],"exampleFix":"// before\nSubscribeServiceRequest req = new SubscribeServiceRequest(ns, group, \"\", clusters, false);\n// after\nSubscribeServiceRequest req = new SubscribeServiceRequest(ns, group, \"my-service\", clusters, false);","handlingStrategy":"validation","validationCode":"if (StringUtils.isBlank(request.getServiceName())) {\n    throw new IllegalArgumentException(\"serviceName is required to subscribe\");\n}","typeGuard":"static boolean hasServiceName(SubscribeServiceRequest r) {\n    return r != null && StringUtils.isNotBlank(r.getServiceName());\n}","tryCatchPattern":"try {\n    namingService.subscribe(serviceName, listener);\n} catch (NacosException e) {\n    if (e.getErrCode() == NacosException.INVALID_PARAM\n        && e.getMessage().contains(\"serviceName is blank\")) {\n        // supply the service name and retry\n    } else {\n        throw e;\n    }\n}","preventionTips":["Resolve serviceName before subscribing; do not subscribe with a blank name.","Use the high-level NamingService.subscribe API.","For pattern-based watching, use fuzzy-watch instead."],"tags":["naming","grpc","validation","invalid-param","subscribe"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}