Bug: Dependency Trees uses dependencies[0] as root instead of metadata.component.bom-ref
Maintainers usually reply within 1 day
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 68/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- typescript
- Domain
- frontend, testing-qa
Research direction
Read spring-boot-admin-server-ui/src/main/frontend/views/instances/sbomdependencytrees/sbomUtils.ts and tree.vue to trace how the SBOM root and dependency records reach normalizeData(). Use the provided root-not-first.cdx.json or mock instance.fetchSbom() in tree.spec.ts, then verify that metadata.component["bom-ref"] selects the root regardless of dependency order and that reordered-root regression cases pass.
Written by the indexing model from the issue text.
Description
Spring Boot Admin Server information
- Version: 4.1.3
- Spring Boot version: 4.1.1
Client information
- Spring Boot versions: 3.5.10
- SBOM format: CycloneDX JSON
Description
The Dependency Trees view selects the first entry in dependencies as the root. It does not use the component described by metadata.component["bom-ref"].
As a result, the UI can display only a library's subtree even though the SBOM contains the application's dependency graph. Reordering otherwise identical dependency records changes the displayed root and visible dependencies.
This is present in the 4.1.3 source and in master inspected on 2026-10-03. The normalization behavior was reproduced in isolation using the existing helper's executable logic; this is not a claim that a full SBA browser integration test was run.
Minimal input
Save as root-not-first.cdx.json:
{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"version": 1,
"metadata": {
"component": { "type": "application", "bom-ref": "app", "name": "demo-app", "version": "1.0.0" }
},
"components": [
{ "type": "library", "bom-ref": "a", "name": "library-a", "version": "1.0.0" },
{ "type": "library", "bom-ref": "b", "name": "library-b", "version": "1.0.0" },
{ "type": "library", "bom-ref": "c", "name": "library-c", "version": "1.0.0" }
],
"dependencies": [
{ "ref": "a", "dependsOn": ["c"] },
{ "ref": "app", "dependsOn": ["a", "b"] },
{ "ref": "b", "dependsOn": [] },
{ "ref": "c", "dependsOn": [] }
]
}
Reproduction
At helper level, pass the fixture's dependencies to normalizeData(). The result is rooted at a with child c. Move only the app record to index zero and repeat: the root becomes app and both a and b appear.
For UI reproduction, return the same document from the monitored application's SBOM endpoint (or mock instance.fetchSbom() in tree.spec.ts), then open Dependency Trees. Repeat with only the array order changed.
Actual normalized tree:
a
└── c
Expected tree:
app
├── a
│ └── c
└── b
The result should be independent of the order of dependencies records.
Cause
In sbomUtils.ts at 4.1.3, normalizeData() reads both the root's reference and its children from sbomDependencies[0].
In tree.vue at 4.1.3, fetchSbomDependencies() retains only res.data.dependencies, so the normalizer never receives the metadata root reference.
CycloneDX identifies dependency targets by bom-ref; metadata.component describes the component that the BOM is about. The consumer should not infer that component from array position. See the CycloneDX 1.6 schema.
Suggested fix and regression coverage
- Pass
metadata.component["bom-ref"]along with the dependency records, or pass the required parts of the SBOM document to the normalizer. - Select the root by exact, unmodified
bom-ref, then look up its outgoing edges byref. - Keep display-name normalization separate from graph identity.
- Define a safe policy for absent metadata, absent root records and missing/empty dependency data; do not silently invent an application root from index zero.
- Test reordered records, root first/middle/last, and metadata propagation through
tree.vue.
There is a related independent problem: recursive expansion currently has no cycle detection. Selecting the correct root can expose a previously unreachable cycle, so the two fixes should be considered together. [Add the cycle issue link after creating it.]
Related reports
- #5153 concerns missing dependency data / an undefined-index error; its discussion does not establish this ordering defect.
- #5358 reports missing dependencies without a minimal example demonstrating root selection.
- #3463 originally requested dependency graph visualization.
I would be happy to contribute a PR targeting master with regression tests.
- Dominant language
- Java
- Stars
- 12.9k
- Forks
- 3.2k
- Avg merge
- 23h 31m
- Merged PRs (30d)
- 72
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from codecentric/spring-boot-admin
-
Bug: Dependency Trees overflows the call stack on cyclic SBOM dependency graphsPossibly taken @faystmax claimed this 3 days ago. Open
Difficulty 4/5 3-5 days Newbie friendliness 68/100
codecentric/spring-boot-admin#5746 ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
codecentric/spring-boot-admin#5743 ·
Maintainers usually reply within 1 day
-
Bug: Filtering rules are not synchronized between SBA nodesPossibly taken @SteKoe claimed this 5 days ago. Open
Difficulty 3/5 1-2 days Newbie friendliness 45/100
codecentric/spring-boot-admin#5721 · 3 comments ·
Maintainers usually reply within 1 day
-
Bug: Multiple notifications from multiple instancesPossibly taken @YadavKshitiz claimed this 7 days ago. Open
Difficulty 4/5 3-5 days Newbie friendliness 55/100
codecentric/spring-boot-admin#5716 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 52/100
codecentric/spring-boot-admin#5597 · 6 comments ·
Maintainers usually reply within 1 day
All issues in codecentric/spring-boot-admin
Similar issues
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
commonmark/commonmark-java#460 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
GoogleCloudPlatform/spring-cloud-gcp#4664 ·
Maintainers usually reply within 1 day
-
enhancement user story
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100