{"record":{"id":"f8b8bd0bbc72408c","repo":"quarkusio/quarkus","slug":"invalid-external-url-can-not-be-empty","errorCode":null,"errorMessage":"Invalid external URL, can not be empty","messagePattern":"Invalid external URL, 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":35,"sourceCode":"    public static final String MIME_TYPE_HTML = \"text/html\";\n    public static final String MIME_TYPE_JSON = \"application/json\";\n    public static final String MIME_TYPE_YAML = \"application/yaml\";\n    public static final String MIME_TYPE_PDF = \"application/pdf\";\n\n    protected ExternalPageBuilder(String title) {\n        super();\n        super.title = title;\n        super.componentLink = QWC_EXTERNAL_PAGE_JS;\n        super.internalComponent = true;// As external page runs on \"internal\" namespace\n    }\n\n    public ExternalPageBuilder url(String url) {\n        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","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/ExternalPageBuilder.java#L17-L53","documentation":"ExternalPageBuilder.url(String, String) validates that the external page URL is non-null and non-empty before storing it as the EXTERNAL_URL metadata. An external Dev UI page is by definition a link to some URL; an empty one cannot be rendered.","triggerScenarios":"Calling externalPage().url(\"\") or url(null) directly, or via the one-arg url(String) overload which delegates with a null externalLink.","commonSituations":"URL loaded from configuration (application.properties/env) that is missing or empty when building Dev UI pages at deployment time; template strings interpolated from config keys that were never set; typos so the variable holding the URL is a different, empty one.","solutions":["Pass a concrete absolute or app-relative URL, e.g. externalPage().url(\"https://grafana.example.com/dashboard\")","If the URL comes from config, validate/default it before building: url(cfg.url().isEmpty() ? DEFAULT_URL : cfg.url())","Skip registering the external page when the configured URL is absent instead of building it with an empty value","Check for leading/trailing whitespace-only values — normalize with strip() first"],"exampleFix":"// before\nString url = config.dashboardUrl(); // \"\"\nexternalPage().url(url); // throws\n// after\nString url = config.dashboardUrl();\nif (url != null && !url.isBlank()) {\n    externalPage().url(url);\n}","handlingStrategy":"validation","validationCode":"if (url == null || url.isBlank()) {\n    throw new IllegalStateException(\"External page URL must be non-empty before calling url()\");\n}","typeGuard":"boolean isUsableUrl(String u) {\n    return u != null && !u.isBlank() && (u.startsWith(\"http://\") || u.startsWith(\"https://\") || u.startsWith(\"/\"));\n}","tryCatchPattern":"try {\n    externalPage().url(u);\n} catch (RuntimeException e) {\n    if (e.getMessage().contains(\"Invalid external URL\")) {\n        log.warnf(\"Skipping external page, url empty\");\n    } else throw e;\n}","preventionTips":["Validate configured URLs with isBlank() before building Dev UI pages","Skip page registration when the configured URL is absent","Normalize URLs (strip whitespace) before passing them","Keep defaults for optional external links in one constants class"],"tags":["devui","external-page","url","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"}