Blog
Production error deep-dives — root cause, reproduction, and the fix that holds.
block()/blockFirst()/blockLast() Are Blocking — Here's Why
WebClient.block() throws 'are blocking, which is not supported' and it looks like a Netty bug. It isn't. Here's the real mechanism, and the failure it's hiding.
Spring Boot 4: @JsonComponent Silently Stops Working
Upgraded to Spring Boot 4 and your @JsonComponent went quiet? Jackson 3 took the HTTP layer without telling you. Here's the exact mechanism and the real fix.
Binding to target ... failed: two bugs, one identical banner
BindValidationException and UnboundConfigurationPropertiesException print the exact same Spring Boot startup banner. Here's how to tell which broke your app.
APPLICATION FAILED TO START, and When You Don't Get It
Spring Boot's failure banner only shows up when one of ~40 built-in analyzers recognizes your exception. Here's the catalog, and what prints when none do.
How to Use Java Records: Build an Expense Tracker (Java 21)
Build a small expense tracker with Java 21 records: compact constructors, validation, defensive copies, with-ers and the array trap, all compiled and run.
TestRestTemplate's NoSuchBeanDefinitionException in Spring Boot 4
Boot 4 quietly stopped auto-wiring TestRestTemplate and MockMvc in @SpringBootTest, and the @MockBean-to-@MockitoBean rename hides a sneakier trap of its own.
How to Collect Stream Results in Java: Collectors Guide
Build a URL-shortener click report that uses groupingBy, partitioningBy, toMap, teeing and a custom Collector on Java 21, with 21 checks and the errors I hit.
Caused by in Java Stack Traces: Finding the Root Cause
A Caused by in a Java stack trace is a wrapped second exception. How chains print, what '... N more' hides, and how to find the root cause every time.
How to Use Java Enums with Fields and Methods (Java 21)
Build a library loan desk in plain Java 21: an enum with fields, a lookup by code, per-constant behaviour, and a small state machine, all checked by 36 tests.
ThreadLocal Goes Missing Inside StructuredTaskScope
A ThreadLocal that worked fine in a thread pool returns null the moment a virtual thread forks a subtask. Here's the mechanism, and what actually fixes it.