{"record":{"id":"a52a294ce6619f74","repo":"apache/incubator-seata","slug":"not-found-service-provider-for","errorCode":null,"errorMessage":"not found service provider for : {}","messagePattern":"not found service provider for : (.+?)","errorType":"exception","errorClass":"EnhancedServiceNotFoundException","httpStatus":null,"severity":"error","filePath":"common/src/main/java/org/apache/seata/common/loader/EnhancedServiceLoader.java","lineNumber":472,"sourceCode":"            }\n            try {\n                loadAllExtensionClass(loader, includeCompatible);\n                ExtensionDefinition<S> cachedExtensionDefinition = getCachedExtensionDefinition(activateName);\n                return getExtensionInstance(cachedExtensionDefinition, loader, argTypes, args);\n            } catch (Throwable e) {\n                if (e instanceof EnhancedServiceNotFoundException) {\n                    throw (EnhancedServiceNotFoundException) e;\n                } else {\n                    throw new EnhancedServiceNotFoundException(\"not found service provider for : \" + type.getName()\n                            + \" caused by \" + ExceptionUtils.getStackTrace(e));\n                }\n            }\n        }\n\n        private S getExtensionInstance(\n                ExtensionDefinition<S> definition, ClassLoader loader, Class<?>[] argTypes, Object[] args) {\n            if (definition == null) {\n                throw new EnhancedServiceNotFoundException(\"not found service provider for : \" + type.getName());\n            }\n            if (Scope.SINGLETON.equals(definition.getScope())) {\n                Holder<Object> holder =\n                        CollectionUtils.computeIfAbsent(definitionToInstanceMap, definition, key -> new Holder<>());\n                Object instance = holder.get();\n                if (instance == null) {\n                    synchronized (holder) {\n                        instance = holder.get();\n                        if (instance == null) {\n                            instance = createNewExtension(definition, loader, argTypes, args);\n                            holder.set(instance);\n                        }\n                    }\n                }\n                return (S) instance;\n            } else {\n                return createNewExtension(definition, loader, argTypes, args);\n            }","sourceCodeStart":454,"sourceCodeEnd":490,"githubUrl":"https://github.com/apache/incubator-seata/blob/e01f97c6db397165050caa6764020410c2c8199a/common/src/main/java/org/apache/seata/common/loader/EnhancedServiceLoader.java#L454-L490","documentation":"getExtensionInstance throws this plain EnhancedServiceNotFoundException when the resolved ExtensionDefinition is null — i.e. the loader was asked for a definition it does not have. For the by-name path this means no provider is registered under that activateName; for the default path it means no default provider is discoverable at all.","triggerScenarios":"EnhancedServiceLoader.load(Spi.class, name) where no META-INF/services entry declares that name; or the default lookup finds zero providers (service file missing, empty, or not visible to the classloader).","commonSituations":"Typo in the provider name in configuration (e.g. serializer/db-vs-mysql names); the SPI service descriptor file was not copied into the jar; seata optional dependency jars omitted; shading dropped META-INF/services.","solutions":["Check the requested provider name against the names registered in the provider jar's META-INF/services file.","Add the dependency jar that contains the provider for that name (e.g. seata-serializer-seata, seata-mysql).","Fix fat-jar packaging with ServicesResourceTransformer to preserve service descriptors.","Verify classloader visibility in app-server/OSGi environments."],"exampleFix":"# before: seata.serializer=\"seataa\"   # typo, no provider registered\n# after:  seata.serializer=\"seata\"","handlingStrategy":"validation","validationCode":"// Validate config values against registered SPI names before load\nSet<String> registeredNames = readSpiNames(\"META-INF/services/\" + SpiType.class.getName());\nif (!registeredNames.contains(configuredName)) {\n    throw new IllegalArgumentException(\"Unknown provider '\" + configuredName + \"', valid: \" + registeredNames);\n}","typeGuard":null,"tryCatchPattern":"try {\n    T provider = EnhancedServiceLoader.load(SpiType.class, name);\n} catch (EnhancedServiceNotFoundException e) {\n    // message has no 'caused by' -> provider truly unregistered;\n    // surface list of registered names to the user for a quick fix\n    throw e;\n}","preventionTips":["Validate provider names in configuration at startup against the registered SPI set.","Keep seata extension modules (serializer, config, registry providers) on the classpath when their names are configured.","Preserve META-INF/services in shaded jars with ServicesResourceTransformer."],"tags":["spi","service-loader","missing-provider","configuration","seata"],"backgroundTag":null,"analyzedSha":"e01f97c6db397165050caa6764020410c2c8199a","analyzedAt":"2026-08-14T10:23:53.097Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}