{"record":{"id":"1b3109c1262a6286","repo":"quarkusio/quarkus","slug":"id-property-must-be-set","errorCode":null,"errorMessage":"'id' property must be set","messagePattern":"'id' property must be set","errorType":"exception","errorClass":"OidcClientException","httpStatus":null,"severity":"error","filePath":"extensions/oidc-client/runtime/src/main/java/io/quarkus/oidc/client/runtime/OidcClientsImpl.java","lineNumber":101,"sourceCode":"        return staticOidcClients.get(id);\n    }\n\n    public Map<String, OidcClient> getStaticOidcClients() {\n        return staticOidcClients;\n    }\n\n    @Override\n    public void close() throws IOException {\n        defaultClient.close();\n        for (OidcClient client : staticOidcClients.values()) {\n            client.close();\n        }\n    }\n\n    @Override\n    public Uni<OidcClient> newClient(OidcClientConfig clientConfig) {\n        if (clientConfig.id().isEmpty()) {\n            throw new OidcClientException(\"'id' property must be set\");\n        }\n        return createOidcClientUni(clientConfig, clientConfig.id().get(), vertx, tlsSupport, proxyConfigurationRegistry);\n    }\n\n    @Singleton\n    @Produces\n    @Unremovable\n    OidcClient createOidcClientBean() {\n        return defaultClient;\n    }\n\n    @PreDestroy\n    void destroy() {\n        try {\n            close();\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/oidc-client/runtime/src/main/java/io/quarkus/oidc/client/runtime/OidcClientsImpl.java#L83-L119","documentation":"OidcClientsImpl.newClient requires every dynamically created OidcClientConfig to carry an id, since the id identifies the named client configuration. This OidcClientException is thrown synchronously when id is absent.","triggerScenarios":"Calling OidcClients.newClient(config) with an OidcClientConfig whose id property (config.id()) is unset — programmatic client creation without assigning the identifier.","commonSituations":"Building OidcClientConfig programmatically for a named client and forgetting .setId(); config mapping binding from properties that lack quarkus.oidc-client.<name>.id or an id when created ad hoc.","solutions":["Set the id on the OidcClientConfig before calling newClient (e.g. config with quarkus.oidc-client.\"name\".id=name)","Ensure the config source actually includes the id property","If using OidcClientConfig programmatically, call the builder/setter that populates id"],"exampleFix":"// before\nOidcClientConfig cfg = new OidcClientConfig();\n// no id set\nclient = oidcClients.newClient(cfg); // throws\n\n// after\nOidcClientConfig cfg = new OidcClientConfig();\ncfg.id(Optional.of(\"my-client\"));\nclient = oidcClients.newClient(cfg);","handlingStrategy":"validation","validationCode":"if (clientConfig.id().isEmpty()) { throw new IllegalArgumentException(\"OidcClientConfig.id must be set before newClient()\"); }","typeGuard":"boolean hasId(OidcClientConfig c) { return c.id().isPresent() && !c.id().get().isBlank(); }","tryCatchPattern":"try { client = oidcClients.newClient(cfg); } catch (OidcClientException e) { if (e.getMessage().contains(\"'id' property must be set\")) { cfg = withId(cfg, \"default\"); client = oidcClients.newClient(cfg); } else throw e; }","preventionTips":["Always assign id when constructing OidcClientConfig programmatically","Ensure quarkus.oidc-client.\"<name>\".id is present in config sources","Centralize client creation in a factory that asserts id presence"],"tags":["oidc","config","programmatic-client"],"backgroundTag":"missing-required-config-property","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"}