quarkusio/quarkus · error · RuntimeException
Not enough information to build the page. Set at least one…
Error message
Not enough information to build the page. Set at least one of componentLink and/or componentName and/or title
What it means
PageBuilder.build() requires identifying information for the page: at least one of componentName, componentLink, or title. The builder derives a component link from the component name or title when componentLink is absent, but with none of the three set there is nothing to render, so it fails fast.
Solutions
- Add a title: pageBuilder().title("My Page") — the builder will derive a component link from it
- Or set componentLink("qwc-my-page.js") / componentName("qwc-my-page") directly
- Validate the source data before building; skip creating the page when the identifying fields are blank
- Chain setters in one fluent expression so an identifying call is structurally required
Example fix
// before
PageBuilder pb = new PageBuilder();
Page page = pb.build(); // throws
// after
PageBuilder pb = new PageBuilder()
.title("My Extension")
.componentLink("qwc-my-extension.js");
Page page = pb.build(); Defensive patterns
Strategy: validation
Validate before calling
if (componentName == null && componentLink == null && (title == null || title.isBlank())) {
throw new IllegalStateException("PageBuilder needs componentName, componentLink, or title");
} Type guard
boolean isBuildablePage(PageBuilder b) {
return b != null; // plus keep your own record of which identifying setter was applied
} Try / catch
try {
return pageBuilder.build();
} catch (RuntimeException e) {
if (e.getMessage().contains("Not enough information to build the page")) {
log.warn("Skipping unnamed Dev UI page");
return null;
}
throw e;
} Prevention
- Always start a PageBuilder chain with title(...) or componentLink(...)
- Validate config-derived names before feeding them to the builder
- Skip building pages whose source data is empty
- Add a deployment-time test that builds all pages the extension registers
When it happens
Trigger: Calling pageBuilder().build() on a completely fresh builder, or where all three of componentName(...), componentLink(...), title(...) calls were conditionally skipped or passed null/blank values.
Common situations: Extension authors adding Dev UI pages whose name/title come from config that is empty; copy-pasted builder code where all identifying setters were removed; generic page-generation loops where the data source yielded an empty record.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- CardAction title is required
- CardText requires either staticText(), dynamicText(), or…
- Invalid fileName
- A blocking route cannot be a failure route
- A failure route cannot be a blocking route
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/3802b4ab4ad0a8c1.
Report an issue: GitHub.
Appendix: source
Thrown at extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/page/PageBuilder.java:147
return (T) this;
}
public T excludeFromMenu() {
this.includeInMenu = false;
return (T) this;
}
@SuppressWarnings("unchecked")
public T extension(String extension) {
this.extensionId = extension.toLowerCase().replaceAll(SPACE, DASH);
this.metadata.put("extensionName", extension);
this.metadata.put("extensionId", extensionId); // TODO: Remove ?
return (T) this;
}
public Page build() {
if (this.componentName == null && this.componentLink == null && this.title == null) {
throw new RuntimeException(
"Not enough information to build the page. Set at least one of componentLink and/or componentName and/or title");
}
// Guess the component link from the component name or title
if (this.componentLink == null) {
if (this.componentName != null) {
this.componentLink = this.componentName + DOT_JS;
} else if (this.title != null) {
this.componentLink = QWC_DASH + this.title.toLowerCase().replaceAll(SPACE, DASH) + DOT_JS;
}
}
// Guess the component name from the componentlink or title
if (this.componentName == null) {
this.componentName = this.componentLink.substring(0, this.componentLink.lastIndexOf(DOT)); // Remove the file extension (.js)
}
// Guess the titleView on GitHub (pinned to e1c734241f)