{"record":{"id":"fa54f24113ea800f","repo":"quarkusio/quarkus","slug":"invalid-dynamic-url-method-name-can-not-be-empty","errorCode":null,"errorMessage":"Invalid dynamic URL Method name, can not be empty","messagePattern":"Invalid dynamic URL Method name, can not be empty","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/ExternalPageBuilder.java","lineNumber":48,"sourceCode":"        return url(url, null);\n    }\n\n    public ExternalPageBuilder url(String url, String externalLink) {\n        if (url == null || url.isEmpty()) {\n            throw new RuntimeException(\"Invalid external URL, can not be empty\");\n        }\n        super.metadata.put(EXTERNAL_URL, url);\n        if (externalLink != null) {\n            return staticLabel(\"<a style='color: var(--lumo-contrast-80pct);' href='\" + externalLink\n                    + \"' target='_blank'><vaadin-icon class='icon' icon='font-awesome-solid:up-right-from-square'></vaadin-icon></a>\");\n        }\n        return this;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public ExternalPageBuilder dynamicUrlJsonRPCMethodName(String methodName) {\n        if (methodName == null || methodName.isEmpty()) {\n            throw new RuntimeException(\"Invalid dynamic URL Method name, can not be empty\");\n        }\n        super.metadata.put(DYNAMIC_URL, methodName);\n        return this;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public ExternalPageBuilder dynamicUrlJsonRPCMethodName(String methodName, Map<String, String> parameters) {\n        dynamicUrlJsonRPCMethodName(methodName);\n        if (parameters != null && !parameters.isEmpty()) {\n            super.metadata.put(DYNAMIC_URL + \"Params\", parameters.entrySet().stream()\n                    .map(e -> URLEncoder.encode(e.getKey(), StandardCharsets.UTF_8) + \"=\"\n                            + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))\n                    .reduce((a, b) -> a + \"&\" + b)\n                    .orElse(\"\"));\n        }\n        return this;\n    }\n","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/ExternalPageBuilder.java#L30-L66","documentation":"ExternalPageBuilder.dynamicUrlJsonRPCMethodName(String) sets the name of the JSON-RPC method that computes the page URL at runtime. An empty method name cannot be resolved against any Dev UI JSON-RPC service, so the builder rejects it.","triggerScenarios":"Calling dynamicUrlJsonRPCMethodName(\"\") or dynamicUrlJsonRPCMethodName(null), often because the method name is assembled from config or a constant that is unset.","commonSituations":"Extension authors making the external URL configurable at runtime via a @JsonRPC provider but passing an uninitialized/blank name; renaming the provider method and leaving an empty constant behind; config-driven Dev UI pages where the method-name property is missing.","solutions":["Pass the exact method name exposed by your Dev UI JSON-RPC service, e.g. dynamicUrlJsonRPCMethodName(\"getDashboardUrl\")","Confirm the provider class is registered as a Dev UI JSON-RPC service and the name matches exactly (case-sensitive)","If the name comes from config, fail earlier with a clearer message or default it to a valid method name","Fall back to a static url(...) when no dynamic provider is available"],"exampleFix":"// before\nString m = config.urlProviderMethod(); // \"\"\nexternalPage().dynamicUrlJsonRPCMethodName(m); // throws\n// after\nString m = config.urlProviderMethod();\nexternalPage().dynamicUrlJsonRPCMethodName(m.isBlank() ? \"getDefaultUrl\" : m);","handlingStrategy":"validation","validationCode":"if (methodName == null || methodName.isBlank()) {\n    throw new IllegalStateException(\"Dynamic URL JSON-RPC method name must be non-empty\");\n}","typeGuard":"boolean isValidRpcName(String m) {\n    return m != null && m.matches(\"[a-zA-Z][a-zA-Z0-9]*\");\n}","tryCatchPattern":"try {\n    externalPage().dynamicUrlJsonRPCMethodName(m);\n} catch (RuntimeException e) {\n    if (e.getMessage().contains(\"dynamic URL Method name\")) {\n        externalPage().url(DEFAULT_URL); // static fallback\n    } else throw e;\n}","preventionTips":["Reference JSON-RPC method names via constants shared with the provider class","Verify the provider is registered as a Dev UI JSON-RPC service","Fall back to a static url() when no dynamic provider is configured","Fail early on blank config values with your own clearer message"],"tags":["devui","external-page","jsonrpc","validation"],"backgroundTag":"empty-url","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"}