<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1" -->

---
title: No Database Operations Found: What Writing a Spring Boot...
description: An engineer describes building a static analyzer for Spring Boot codebases that traces what an endpoint touches, and how nearly every serious bug produced a...
canonical: https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: No Database Operations Found: What Writing a Spring Boot Analyzer Taught Me About Spring | daily.dev
og:description: An engineer describes building a static analyzer for Spring Boot codebases that traces what an endpoint touches, and how nearly every serious bug produced a...
og:url: https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1
og:image: https://api.daily.dev/og/posts/lY4PuHNc1.png
og:image:alt: No Database Operations Found: What Writing a Spring Boot Analyzer Taught Me About Spring
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# No Database Operations Found: What Writing a Spring Boot Analyzer Taught Me About Spring

**[Foojay.io](https://daily.dev/sources/foojayio)** · 10 min read · 23 upvotes · 2 comments

## Summary

An engineer describes building a static analyzer for Spring Boot codebases that traces what an endpoint touches, and how nearly every serious bug produced a false 'nothing found' rather than a wrong edge. Key discoveries: routes often live on interfaces rather than controllers (Spring PetClinic REST had zero method-level annotations in source), functional RouterFunctions routing is invisible to annotation scans, @ModelAttribute methods run before handlers with no call site, Spring Data repository methods like save() exist nowhere in source, @Transactional is usually declared at the class level rather than the method, application events and executor-submitted work have no traceable call graph, and JPQL/messaging destination strings create false matches (e.g., FETCH keyword misread as a table name). The piece concludes that 'completeness' in such a tool is a license to assert absence, not a quality score, and that reviewers reading diffs have the same blind spots the analyzer did.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://foojay.io/today/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring>

## Questions this post answers

### Why does my Spring Boot static analysis tool report no database operations for endpoints that clearly write to the database?

It happens because Spring runs code that nothing in the source visibly calls. Common causes include Spring Data repository methods like save() that exist in no source file, @Transactional declared at the class level rather than the method, @ModelAttribute methods that run before the handler with no call site, and work handed to an ExecutorService or published as an application event, none of which appear in a call-graph walk rooted at the handler.

_Developers debugging call-graph blind spots in Spring compare notes on these gotchas via daily.dev._

### Why do my Spring controller endpoints not show up when I grep for @RequestMapping or @GetMapping annotations?

The mapping annotations may live on an interface rather than the implementing controller class, a pattern produced by openapi-generator's spring generator with interfaceOnly, or by teams writing a shared API contract by hand. The served route combines the path declared on the interface method with the base path declared on the implementing class, so grepping only the controller class finds nothing.

_Teams tracing API contracts generated from OpenAPI specs often hit this gap; daily.dev surfaces write-ups like this for Spring routing quirks._

### How does Spring RabbitMQ route a message from a producer to a listener if the exchange name and queue name are different strings?

RabbitMQ never joins a producer and a listener on a shared destination string; a producer names an exchange plus a routing key, while a listener binds to a queue, and only a declared binding connects exchange, routing key, and queue via AMQP's routing rules. The exception is the two-argument convertAndSend overload, which uses the default exchange where the routing key equals the queue name.

_Engineers debugging RabbitMQ topology mismatches can follow deep dives like this through daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@leonidbugaev** · 0 upvotes

> PetClinic REST with 528 methods and one found endpoint (the Swagger redirect) is the number I'd keep. The @ModelAttribute ones were worse: "no database operations" was true of the handler and false of the request, and there's no call site to walk. I've reviewed diffs the same way, starting at the handler.

**@agustinbarrientos** · 0 upvotes

> Could the analyzer show its work when it reports no database operations?

---

Tags: [#java](https://daily.dev/tags/java), [#spring](https://daily.dev/tags/spring), [#spring-boot](https://daily.dev/tags/spring-boot), [#code-review](https://daily.dev/tags/code-review)

[View this post on daily.dev](https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"No Database Operations Found: What Writing a Spring Boot Analyzer Taught Me About Spring","url":"https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1"},"datePublished":"2026-09-03T06:36:03.588Z","dateModified":"2026-09-03T07:31:26.005Z","description":"An engineer describes building a static analyzer for Spring Boot codebases that traces what an endpoint touches, and how nearly every serious bug produced a...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/c83c5ba271f93392c04ee419e0049b01?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/c83c5ba271f93392c04ee419e0049b01?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Foojay.io","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Foojay.io","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/1820f6a6ae944760aa322b67ed85f848","url":"https://daily.dev/sources/foojayio"},"commentCount":2,"discussionUrl":"https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":23},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":2}],"keywords":"java,spring,spring-boot,code-review","timeRequired":"PT10M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Foojay.io","item":"https://daily.dev/sources/foojayio"},{"@type":"ListItem","position":3,"name":"No Database Operations Found: What Writing a Spring Boot Analyzer Taught Me About Spring"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1","comment":[{"@type":"Comment","text":"PetClinic REST with 528 methods and one found endpoint (the Swagger redirect) is the number I’d keep. The @ModelAttribute ones were worse: “no database operations” was true of the handler and false of the request, and there’s no call site to walk. I’ve reviewed diffs the same way, starting at the handler.","datePublished":"2026-09-03T10:59:21.053Z","url":"https://daily.dev/posts/lY4PuHNc1#c-UswQeri2f","author":{"@type":"Person","name":"Leonid Bugaev","url":"https://daily.dev/leonidbugaev","image":"https://lh3.googleusercontent.com/a/ACg8ocLhMgurwTmJElWaH9A8Ju8cHvZxgMCDt009jEYkmFCyUGAoaGSw=s96-c"}},{"@type":"Comment","text":"Could the analyzer show its work when it reports no database operations?","datePublished":"2026-09-04T22:23:21.561Z","url":"https://daily.dev/posts/lY4PuHNc1#c-5jnVLgYXt","author":{"@type":"Person","name":"Agustin Barrientos","url":"https://daily.dev/agustinbarrientos","image":"https://media.daily.dev/image/upload/s--5ayxQnqn--/f_auto/v1788281802/avatars/avatar_wQYYVe5Tbj0NJ7C7qPoa8?_a=BAMAMicg0"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring-ly4puhnc1#faq","mainEntity":[{"@type":"Question","name":"Why does my Spring Boot static analysis tool report no database operations for endpoints that clearly write to the database?","acceptedAnswer":{"@type":"Answer","text":"It happens because Spring runs code that nothing in the source visibly calls. Common causes include Spring Data repository methods like save() that exist in no source file, @Transactional declared at the class level rather than the method, @ModelAttribute methods that run before the handler with no call site, and work handed to an ExecutorService or published as an application event, none of which appear in a call-graph walk rooted at the handler. Developers debugging call-graph blind spots in Spring compare notes on these gotchas via daily.dev."}},{"@type":"Question","name":"Why do my Spring controller endpoints not show up when I grep for @RequestMapping or @GetMapping annotations?","acceptedAnswer":{"@type":"Answer","text":"The mapping annotations may live on an interface rather than the implementing controller class, a pattern produced by openapi-generator's spring generator with interfaceOnly, or by teams writing a shared API contract by hand. The served route combines the path declared on the interface method with the base path declared on the implementing class, so grepping only the controller class finds nothing. Teams tracing API contracts generated from OpenAPI specs often hit this gap; daily.dev surfaces write-ups like this for Spring routing quirks."}},{"@type":"Question","name":"How does Spring RabbitMQ route a message from a producer to a listener if the exchange name and queue name are different strings?","acceptedAnswer":{"@type":"Answer","text":"RabbitMQ never joins a producer and a listener on a shared destination string; a producer names an exchange plus a routing key, while a listener binds to a queue, and only a declared binding connects exchange, routing key, and queue via AMQP's routing rules. The exception is the two-argument convertAndSend overload, which uses the default exchange where the routing key equals the queue name. Engineers debugging RabbitMQ topology mismatches can follow deep dives like this through daily.dev."}}]}
```

