CodeStackFoundry

DOCUMENTATION

Spring Service Navigator

Spring Service Navigator is an IntelliJ IDEA plugin that maps every inter-service HTTP call in a Spring Boot microservices workspace and lets you jump between callers and endpoints in one click — no running servers, no instrumentation, no configuration required. It works in IntelliJ IDEA Community Edition, not just Ultimate.

Install from JetBrains Marketplace →
Spring Service Navigator
Spring Service Navigator banner

Why Use This Plugin?


Installation

From JetBrains Marketplace (recommended)

  1. Open Settings/Preferences → Plugins → Marketplace tab.
  2. Search for Spring Service Navigator.
  3. Click Install and restart the IDE when prompted.

From disk (manual)

  1. Download the plugin ZIP from the Releases page.
  2. Open Settings/Preferences → Plugins → ⚙ → Install Plugin from Disk…
  3. Select the downloaded .zip file and restart the IDE.

Outbound Call Navigation

A → GET style forward-arrow icon appears in the gutter next to every HTTP call site. Clicking it navigates directly to the matching @RestController endpoint — even if it lives in a different module. URL building is resolved automatically for string concatenation, String.format, UriComponentsBuilder/UriBuilder chains, lambda URI builders, @Value-injected base URLs, @ConfigurationProperties getters, and ternaries.

OrderService.java
Outbound gutter icon tooltip showing target endpoint, service name, and controller method

Inbound Caller Navigation

An orange back-arrow icon appears next to every @RestController endpoint method. Hovering shows a rich tooltip; clicking opens a popup listing every service that calls that endpoint, grouped by client type — essential before changing an endpoint's path or contract.

UserController.java — inbound callers
Inbound caller popup listing every service and client type calling an endpoint, with navigate buttons

Smart URL Resolution

Real call sites rarely use plain string literals. The resolver handles the patterns actual codebases use, per call site:

// @ConfigurationProperties getter, resolved through indirection restTemplate.getForObject(userServiceProperties.getBaseUrl() + "/api/users/" + userId, User.class); // Ternary — both branches resolved and merged; differing segment becomes {var} restTemplate.getForObject(useV2 ? "/api/v2/users/" + userId : "/api/v1/users/" + userId, User.class); // Reassigned between two calls in the same method — each use resolves independently String url = "/api/users/active"; restTemplate.getForObject(url, User[].class); // → /api/users/active url = "/api/users/archived"; restTemplate.getForObject(url, User[].class); // → /api/users/archived

Config-sourced base URLs (@Value fields and @ConfigurationProperties classes) are read from application.{properties,yaml,yml} and any application-{profile}.* file present, merged together. Reassignment resolution only applies within a single straight-line block — a reassignment inside a conditional falls back to the declaration's own value, rather than guessing which branch ran.


Service Navigator Tool Window

A dedicated tool window builds a complete picture of your microservice architecture from source code alone, across six tabs: Service Map, Endpoints, Statistics, Dependency Matrix, Unresolved Callers, and Dependency Graph.

Service Map
Service Map tab showing the dependency tree across services
Dependency Matrix
Dependency Matrix tab showing a colour-coded service-to-service call count grid
Statistics
Statistics tab showing KPI cards and breakdowns by client type and HTTP method

Press Ctrl+Alt+E or open the Search Everywhere Endpoints tab. Type any combination of HTTP verb, URL fragment, service name, or controller method name and jump straight to it — path variables act as wildcards on both sides.

Go to Endpoint…
Go to Endpoint dialog with search results showing HTTP method badges, matched URL fragments, service names, and line numbers

One Workspace, or Many Repos

Real teams lay out microservice repos differently. Spring Service Navigator supports all three patterns without asking you to restructure anything:

Your setupPatternConfiguration
All services in one repo, or one multi-module buildSingle ProjectNone
Separate repos, opened together in one IntelliJ windowMultiple Content RootsStandard "Add Content Root"
Each service repo opened in its own IntelliJ windowExternal Repo PathsOne-time per-window setting

Pattern 2 — Multiple Content Roots, One Window

Attach each sibling repo as an additional content root of the project you already have open — plain IntelliJ project structure, nothing plugin-specific. Open File → Project Structure → Modules, select your module's Sources tab, click Add Content Root, and pick the sibling repo's root folder. Gutter icons, Ctrl+Click navigation, and the Service Navigator tool window all pick it up immediately — each repo keeps its own Git root, so per-repo version control still works correctly.

Project Structure — Add Content Root
Project Structure dialog with the Modules Sources tab open and a file chooser selecting a sibling repo folder to add as a content root

Pattern 3 — Separate IntelliJ Windows (External Repo Paths)

If each microservice is opened in its own separate IntelliJ window — the most common real-world setup for teams with one repo per service — add the sibling repos under Settings → Tools → Spring Service Navigator → External Repo Paths. Each row can point at a single service repo, or at a base directory containing several sibling repos — nested services are discovered automatically up to 10 folders deep, so one row can cover an entire team's worth of repos.

Settings — External Repo Paths
Spring Service Navigator settings page with the External Repo Paths list showing an individual repo path row and a base-directory row, the plus, folder-browse, and minus toolbar buttons visible above the table

Click Apply and every configured path is scanned alongside this window's own content roots — the Service Navigator tool window, gutter icons, and reverse-caller lookup all include it, no manual refresh needed.

Service Map — cross-repo
Service Navigator tool window Service Map tab listing core-service, france-service, germany-service, and uk-service — discovered from a base-directory External Repo Paths entry — alongside order-service from the primary project, in one unified tree

Also Included


Compatibility


Full documentation, including every gutter icon type, URL resolution rules, and troubleshooting, is in the User Guide on GitHub. Found a bug or have a feature request? Open an issue.