Structured Concurrency in Practice: ExecutorService vs StructuredTaskScope
Most Java concurrency bugs show up when something goes wrong, not when everything works. So let’s break one subtask on purpose and watch what each approach does about it. A Quick Status Check First, a...
View ArticleProject Leyden: Faster Java Startup Without GraalVM’s Pain, and What You Give Up
Java startup has long been the price of a smart runtime. GraalVM Native Image fixed it by replacing the JVM, but that fix came with strings attached. Project Leyden takes a gentler road. So what...
View ArticleExploring HTTP/3 Support in Java 26’s HTTP Client API
Java 26 adds HTTP/3 support to the standard java.net.http.HttpClient API. This allows Java applications to communicate with HTTP/3-enabled servers without requiring a third-party HTTP client library....
View ArticleUnderstanding the @Find Annotation in Hibernate
Hibernate provides several annotations to simplify database operations when working with Java entities. The @Find annotation is often searched for in the context of retrieving entities, but it is...
View ArticleResolving Jackson Deserialization Creator Exception
Jackson is commonly used in Java applications to convert JSON into Java objects. This process is called deserialization. A common exception during deserialization is: Cannot deserialize from Object...
View ArticleLet It Crash vs. Try-Catch: Erlang/BEAM Supervision Trees Against Java’s...
There’s a moment every Java developer has lived through: staring at a stack trace at 2 a.m., trying to figure out whether to catch this exception, wrap it, rethrow it, or just let the whole request...
View ArticleExploring the Agent2Agent (A2A) Protocol with Spring AI
AI applications are rapidly moving from single-model applications toward systems composed of multiple specialized agents. One agent may specialize in weather information, another in travel planning,...
View ArticleDurable Execution You Can Watch, Without a Workflow Engine
A background job charges a customer’s card on step three of four, then throws an exception on step four. The scheduler does what schedulers do and retries the whole job. Step three runs again. The...
View ArticleLong-Term Memory in Spring AI with AutoMemoryTools
AutoMemoryTools lets a Spring AI agent keep useful facts between sessions without treating the whole conversation transcript as permanent context. This article explains the idea and builds a small...
View ArticleSpring REST Docs + Asciidoctor: Automated API Documentation
Ask any backend developer what they hate most about maintaining a REST API, and somewhere near the top of the list you’ll hear “the docs are lying again.” Someone changed a field name three sprints...
View ArticleDynamic Link Generation Based on OAuth2 User Permissions
Most REST APIs treat pagination and navigation as a solved problem, and then quietly ignore a much messier one: what happens when two different users hit the same endpoint and get back two very...
View ArticleLLM Fine-Tuning: SFT, LoRA, QLoRA, RAG and Prompting
Large language models can perform many tasks without any additional training. They can answer questions, summarize text, generate code, classify information, and interact with tools. However, when...
View ArticleExtracting Reliable Structured Data from LLMs
Large language models are good at understanding natural language, but applications usually need information in a predictable form. A customer support application, for example, may receive a message...
View ArticleHATEOAS Pagination: Why PagedModel Doesn’t Work with Custom Repositories
If you’ve spent any real time building REST APIs with Spring, you’ve probably hit this wall: your PagingAndSortingRepository gives you gorgeous, self-documenting PagedModel responses out of the box,...
View ArticleRunning Java Applications on WebAssembly: Exploring WasmEdge and GraalVM...
Java has powered enterprise software, cloud-native microservices, and high-performance backend systems for nearly three decades. Yet, as serverless computing, edge environments, and multi-tenant...
View ArticleGoogle GenAI Chat with Spring AI
Generative Artificial Intelligence has changed the way developers build intelligent applications. Modern applications can use Large Language Models (LLMs) to understand natural language, generate...
View ArticleLLM Streaming with Embabel
Large Language Models can take several seconds, or sometimes much longer, to produce a complete response. In a traditional blocking application, the caller waits until the entire response has been...
View ArticleSpring AI RAG Tutorial with Spring Boot
Retrieval-Augmented Generation, commonly known as RAG, is one of the most useful patterns for building AI applications that need to answer questions using application-specific or private data. Instead...
View ArticleResilience by Design vs. Resilience by Library: BEAM vs. Go and Java
In distributed systems engineering, few architectural divides are as deep—or as philosophically opposed—as how different runtimes handle failure. When an unexpected error occurs, what should happen?...
View ArticleExploring the Visitor Design Pattern with Java
Design patterns provide established approaches to recurring software design problems. Rather than being ready-made pieces of code, they describe how classes and objects can be organized to make an...
View Article