{"record":{"id":"5b44daaa49fc55b8","repo":"quarkusio/quarkus","slug":"dev-services-for-request-getname-requires-a-s","errorCode":null,"errorMessage":"Dev services for ${request.getName()} requires a startable supplier, but none was provided.","messagePattern":"Dev services for (.+?) requires a startable supplier, but none was provided\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"core/deployment/src/main/java/io/quarkus/deployment/builditem/DevServicesRegistryBuildItem.java","lineNumber":181,"sourceCode":"                        .provide(reusedConfig);\n                if (!extraFromBuildItem.isEmpty()) {\n                    reusedConfig.putAll(extraFromBuildItem);\n                }\n            }\n\n            config.putAll(reusedConfig);\n            overrideConfig.putAll(matchedDevService.overrideConfigs());\n        }\n    }\n\n    private void reallyStart(DevServicesResultBuildItem request, List<DevServicesCustomizerBuildItem> customizers,\n            List<DevServicesAdditionalConfigBuildItem> additionalConfigBuildItems, Map<String, String> allDevServicesConfig,\n            Map<String, String> allDevServicesOverrideConfigs) {\n        StartupLogCompressor compressor = new StartupLogCompressor(\"Dev Services Startup\", null, null);\n        try {\n            Supplier<Startable> startableSupplier = request.getStartableSupplier();\n            if (startableSupplier == null) {\n                throw new IllegalStateException(\n                        \"Dev services for \" + request.getName() + \" requires a startable supplier, but none was provided.\");\n            }\n            Startable startable = startableSupplier.get();\n            for (DevServicesCustomizerBuildItem customizer : customizers) {\n                startable = customizer.apply(request, startable);\n            }\n\n            String missingDependency = null;\n\n            // The config from the new sources isn't easily available via ConfigProvider.getConfig(), so directly inject it into services which depend on it\n            var dependencies = request.getDependencies();\n            if (dependencies != null && !dependencies.isEmpty()) {\n                for (DevServicesResultBuildItem.DevServiceConfigDependency<? extends Startable> dependency : dependencies) {\n\n                    var value = allDevServicesConfig.get(dependency.requiredConfigKey());\n                    if (value != null) {\n                        ((BiConsumer<Startable, String>) dependency.valueInjector()).accept(startable, value);\n                    } else {","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/core/deployment/src/main/java/io/quarkus/deployment/builditem/DevServicesRegistryBuildItem.java#L163-L199","documentation":"DevServicesRegistryBuildItem.reallyStart starts a dev service (e.g. a database container) during Quarkus dev/test mode. It requires the DevServicesRequest to carry a Supplier<Startable>; if none was set, the registry has no way to actually start the service and throws this IllegalStateException immediately at startup. This is an internal programming/extension contract violation, not a user config problem.","triggerScenarios":"Calling DevServicesRegistryBuildItem.start (directly or via the registry) with a request built without DevServicesRequest.startableSupplier(...) — the supplier is null when reallyStart runs.","commonSituations":"Custom extension code or a modified Quarkus build constructing a dev-services request programmatically while forgetting to supply the Startable supplier; regressions in Quarkus core or an extension after refactoring how dev services are registered.","solutions":["Set a startable supplier on the request, e.g. DevServicesRequest with .startableSupplier(() -> new MyStartable(...)) before calling start.","If you only need config from a service already managed elsewhere, use the appropriate existing DevServicesResultBuildItem instead of registering a new request without a supplier.","Check the Quarkus version/extension for a known bug and upgrade if this is thrown by framework code you did not modify."],"exampleFix":"// before\nDevServicesRequest request = DevServicesRequest.of(\"my-db\", featurePriority);\nregistry.start(request);\n// after\nDevServicesRequest request = DevServicesRequest.of(\"my-db\", featurePriority)\n        .startableSupplier(() -> new DataSourceStartable(config));\nregistry.start(request);","handlingStrategy":"validation","validationCode":"if (request.getStartableSupplier() == null) {\n    throw new IllegalStateException(\"DevServicesRequest '\" + request.getName() + \"' is missing its startable supplier; add .startableSupplier(...) before calling start()\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    registry.start(request);\n} catch (IllegalStateException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"requires a startable supplier\")) {\n        // fix request construction; this is a build-time programming error, do not retry\n    }\n    throw e;\n}","preventionTips":["Always use the DevServicesRequest factory/builder methods that force you to supply the Startable supplier","Add a unit test for custom dev-service extensions that drives the registry end-to-end","Never build dev-services requests reflectively or from maps of optional parameters without checking the supplier"],"tags":["quarkus","dev-services","illegal-state","build-time"],"backgroundTag":"missing-required-callback","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}