<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Spring on foojay.io - Friends Of OpenJDK</title><link>https://foojay.io/today/category/spring/</link><description>Recent content in Spring on foojay.io - Friends Of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 03 Sep 2026 06:26:00 +0000</lastBuildDate><atom:link href="https://foojay.io/today/category/spring/index.xml" rel="self" type="application/rss+xml"/><item><title>No Database Operations Found: What Writing a Spring Boot Analyzer Taught Me About Spring</title><link>https://foojay.io/today/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring/</link><pubDate>Thu, 03 Sep 2026 06:26:00 +0000</pubDate><guid>https://foojay.io/today/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring/</guid><description>&lt;p&gt;I spent months building a static analyzer that answers one question about a Spring Boot codebase: if I change this endpoint, what does the change reach?&lt;/p&gt;&#10;&lt;p&gt;Every serious bug I found in it had the same shape.&lt;/p&gt;&#10;&lt;p&gt;Not a wrong edge in a graph. Not a missing feature. A &lt;strong&gt;confident absence&lt;/strong&gt; — the tool stating, definitively, that an endpoint touched no database, opened no transaction, published no message, when it did all three.&lt;/p&gt;</description></item><item><title>DuckDB in Spring Batch: Replace In-Memory Java Loops with One SQL Statement</title><link>https://foojay.io/today/duckdb-in-spring-batch-replace-in-memory-java-loops-with-one-sql-statement/</link><pubDate>Tue, 11 Aug 2026 13:34:43 +0000</pubDate><guid>https://foojay.io/today/duckdb-in-spring-batch-replace-in-memory-java-loops-with-one-sql-statement/</guid><description>&lt;p&gt;Spring Batch jobs usually follow the same pattern: an &lt;code&gt;ItemReader&lt;/code&gt; streams rows, an &lt;code&gt;ItemProcessor&lt;/code&gt; transforms each one, and an &lt;code&gt;ItemWriter&lt;/code&gt; writes them out, chunk by chunk. A chunk-oriented step wires those three pieces together:&lt;/p&gt;&#10;&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;new StepBuilder(&amp;#34;transform&amp;#34;, jobRepository)&#10; .&amp;lt;Order, Summary&amp;gt;chunk(1_000, transactionManager)&#10; .reader(reader) // stream rows&#10; .processor(processor) // transform each row&#10; .writer(writer) // write the chunk&#10; .build();&lt;/pre&gt;&lt;p&gt;&lt;em&gt;The chunk-oriented processing model (&lt;a href="https://docs.spring.io/spring-batch/reference/step/chunk-oriented-processing.html" target="_blank" rel="noopener noreferrer"&gt;Spring Batch reference&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;That pattern works well for moving records between systems.&lt;/p&gt;</description></item><item><title>How to Create a Spring Boot Fraud Scoring Service</title><link>https://foojay.io/today/how-to-create-a-spring-boot-fraud-scoring-service/</link><pubDate>Fri, 31 Jul 2026 08:45:43 +0000</pubDate><guid>https://foojay.io/today/how-to-create-a-spring-boot-fraud-scoring-service/</guid><description>&lt;p&gt;Most Java teams who want a machine learning model in production end up standing up a Python service and calling it over HTTP. That works, but it buys you, as a Java developer, a second runtime, a second deployment pipeline, a network hop on every prediction, and a team boundary that turns retraining into someone else&amp;rsquo;s ticket.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.deepnetts.com/" target="_blank" rel="noopener noreferrer"&gt;Deep Netts&lt;/a&gt; removes that split: it&amp;rsquo;s a pure-Java deep learning library, so the model trains in Java, serializes to a file, and loads back into your Spring Boot application as an ordinary bean. Predictions become in-process method calls measured in microseconds, with nothing extra to deploy, secure, or monitor.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Getting Started with Exposed: Kotlin ORM Made Simple</title><link>https://foojay.io/today/exposed-kotlin-orm-complete-guide/</link><pubDate>Mon, 06 Jul 2026 03:39:00 +0000</pubDate><guid>https://foojay.io/today/exposed-kotlin-orm-complete-guide/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;For quite some time, I have been a huge fan of and fascinated by JetBrains products, tools, and libraries because of their masterful craftsmanship in product creation and their pristine focus on building high-quality developer tools.&lt;/p&gt;&#10;&lt;p&gt;Even more excitingly, JetBrains Java Annotated Monthly newsletters have featured most of the technical articles I wrote for Foojay on topics such as Java, Spring, Spring Boot 4, and OpenRewrite.&lt;/p&gt;&#10;&lt;p&gt;Recently, one Kotlin Domain-Specific Language (DSL) library caught my attention. I immediately tried converting my existing Spring Boot 4 application from Java to Kotlin using Exposed, an ORM framework for Kotlin.&#10;&lt;img src="https://foojay.io/today/exposed-kotlin-orm-complete-guide/Exposed-1024x683.jpg" alt="Exposed" width="1024" height="683" loading="lazy" decoding="async"&gt; Kotlin SQL Libary&lt;/p&gt;</description></item><item><title>You’re invited to IntelliJ IDEA Conf 2026!</title><link>https://foojay.io/today/youre-invited-to-intellij-idea-conf-2026/</link><pubDate>Mon, 29 Jun 2026 18:35:08 +0000</pubDate><guid>https://foojay.io/today/youre-invited-to-intellij-idea-conf-2026/</guid><description>&lt;p&gt;&lt;strong&gt;We are excited to invite you to IntelliJ IDEA Conf 2026, a free virtual event on September 8-9, 2026.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;IntelliJ IDEA Conf is a celebration of the developer community, bringing together professionals who strive for excellence in software development. Join us for this free, live online conference and learn from industry leaders and experts on September 8-9, 2026.&lt;/p&gt;&#10;&lt;p&gt;You&amp;rsquo;ll be able to learn about a broad range of topics relevant to modern Java and Kotlin development, including language evolution, enterprise Java, Spring-based applications, build tooling, containerized workflows, JVM performance, and data access technologies. For more details, see the agenda below.&lt;/p&gt;</description></item><item><title>Jurassic JDK: Migrate or Extinct</title><link>https://foojay.io/today/jurassic-jdk-migrate-or-extinct/</link><pubDate>Fri, 26 Jun 2026 07:28:00 +0000</pubDate><guid>https://foojay.io/today/jurassic-jdk-migrate-or-extinct/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/jurassic-jdk-migrate-or-extinct/1_wul-KqE6vXk4ynnh_IljSQ-1-1024x562.webp" alt="" width="1024" height="562" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;65 million years ago, dinosaurs didn&amp;rsquo;t adapt. They&amp;rsquo;re gone. Your JDK 7 app is giving the same energy. 🫠&lt;/p&gt;&#10;&lt;p&gt;I spent a year and a half migrating more than 15 projects in production. Full time. Real teams, real deadlines, real 2am breakage. This is everything I wish someone had written before I started.&lt;/p&gt;&#10;&lt;h2 id="why-are-we-still-here-"&gt;Why Are We Still Here? 👀&lt;/h2&gt;&#10;&lt;p&gt;Walk into any company with a codebase older than 5 years and you&amp;rsquo;ll hear the same thing:&lt;/p&gt;</description></item><item><title>Foojay Podcast #99: Testing the Untestable: LLM Security for Java Developers with Tiberius</title><link>https://foojay.io/today/foojay-podcast-99/</link><pubDate>Mon, 22 Jun 2026 06:54:00 +0000</pubDate><guid>https://foojay.io/today/foojay-podcast-99/</guid><description>&lt;p&gt;Your AI-powered Java application is live in production. But have you actually tested whether it can be jailbroken or manipulated into leaking data it should never reveal? In this episode, Iryna Dohndorf walks us through Tiberius, an open-source security testing library for LLM applications in Java, and explains why everything you know about unit testing needs a rethink when non-determinism is part of the design.&lt;/p&gt;&#10;&lt;h2 id="youtube"&gt;YouTube&lt;/h2&gt;&#10;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/7bBcTzeevEo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;h2 id="podcast-apps"&gt;Podcast Apps&lt;/h2&gt;&#10;&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Ask a Lille Dev</title><link>https://foojay.io/today/ask-a-lille-dev-what-java-developers-really-think-about-quality-frameworks-communities-and-careers/</link><pubDate>Tue, 16 Jun 2026 00:35:19 +0000</pubDate><guid>https://foojay.io/today/ask-a-lille-dev-what-java-developers-really-think-about-quality-frameworks-communities-and-careers/</guid><description>&lt;p&gt;During the DevLille 2026 conference in Lille, I interviewed several Java developers and tech professionals with one simple goal: collecting authentic and spontaneous insights from the Java ecosystem. ☕🎤&lt;/p&gt;&#10;&lt;p&gt;The result became &lt;strong&gt;&amp;ldquo;Ask a Lille Dev&amp;rdquo;&lt;/strong&gt;, a mini podcast made of short interviews recorded directly during the conference. Instead of long talks or polished marketing speeches, the idea was simple: ask practical questions to people working in tech every day.&lt;/p&gt;</description></item><item><title>AI-Powered Code Review Assistant: Automated Code Analysis with Spring AI and MongoDB</title><link>https://foojay.io/today/ai-powered-code-review-assistant-automated-code-analysis-with-spring-ai-and-mongodb/</link><pubDate>Thu, 14 May 2026 17:09:39 +0000</pubDate><guid>https://foojay.io/today/ai-powered-code-review-assistant-automated-code-analysis-with-spring-ai-and-mongodb/</guid><description>&lt;p&gt;Code reviews catch bugs before they ship, but they take time. Most teams rely on manual review or basic linters that flag syntax issues but miss deeper problems like subtle resource leaks, poor exception handling, or security anti-patterns. Static analysis tools help, but they work with rigid rules that cannot generalize across code variations. A rule that catches &lt;code&gt;catch (Exception e) {}&lt;/code&gt; will miss &lt;code&gt;catch (Throwable t) { return null; }&lt;/code&gt;, even though both are the same underlying problem.&lt;/p&gt;</description></item><item><title>Explore Spring AI SDK – Amazon Bedrock AgentCore – Part 3</title><link>https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/</link><pubDate>Sun, 10 May 2026 09:09:00 +0000</pubDate><guid>https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/</guid><description>&lt;p&gt;In &lt;a href="https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;Part 1&lt;/a&gt; and &lt;a href="https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/"&gt;Part 2&lt;/a&gt;, we explored the Spring AI SDK and Amazon Bedrock AgentCore features, including the agentcore runtime starter and integration of agentcore memory. In this article, we will explore the integration of AgentCore built-in tools, including the Browser and Code Interpreter features.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Repository containing the companion code for the tutorial. &lt;a href="https://github.com/bsmahi/simple-spring-boot-agent" target="_blank" rel="noopener noreferrer"&gt;Go to GitHub&lt;/a&gt;.&lt;/strong&gt;&#10;&lt;img src="https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.jpg" alt="AgentCore Built-In Tool Browser" width="1024" height="576" loading="lazy" decoding="async"&gt; Built-In Tool Browser&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;The use case I am trying to build here is for the given URL; it navigates the entire website and retrieves the content and gives key points and the summary of the page using &lt;strong&gt;the AgentCore Browser&lt;/strong&gt; tool.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Building an AI-Powered Operations Assistant with Spring AI and MongoDB Atlas — Part 1: RAG Foundation</title><link>https://foojay.io/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</link><pubDate>Thu, 07 May 2026 19:22:11 +0000</pubDate><guid>https://foojay.io/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</guid><description>&lt;p&gt;This is the first article in a three-part series. Part 2 covers short-term and long-term memory; Part 3 introduces stateful workflow checkpointing with pause/resume.&lt;/p&gt;&#10;&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;&#10;&lt;p&gt;It&amp;rsquo;s 2 a.m. Suddenly, an alert pops up indicating abnormal CPU usage on the payment services. The on-call engineer opens their laptop, logs into the monitoring dashboards, and begins the hunt. One by one, he searches the runbooks on Confluence, checks the Slack chats, and opens the GitHub wikis and documents shared during the design phase. By the time he finds any useful information, ten minutes have already passed.&lt;/p&gt;</description></item><item><title>Explore Spring AI SDK – Amazon Bedrock AgentCore – Part 2</title><link>https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/</link><pubDate>Mon, 27 Apr 2026 09:09:00 +0000</pubDate><guid>https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/</guid><description>&lt;p&gt;&lt;em&gt;If you&amp;rsquo;re joining us from &lt;a href="https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;Part 1&lt;/a&gt; or need a quick refresher on the architecture, listen to this brief overview of how Spring AI and Amazon Bedrock work together.&lt;/em&gt;&#10;&lt;em&gt;Generated using Notebook LLM for my previous &lt;a href="https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;article&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;In this article, we explore one of the AgentCore capabilities i.e., &lt;em&gt;&lt;strong&gt;memory&lt;/strong&gt;&lt;/em&gt;&#10;&lt;img src="https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/ac_overviewchart_04_07-7f591d25.png" alt="" width="1600" height="329" loading="lazy" decoding="async"&gt; &lt;em&gt;&lt;strong&gt;Source: Amazon&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;To begin, enable &lt;strong&gt;AgentCore memory&lt;/strong&gt; for the agent you built earlier.&lt;br&gt;&#10;&lt;img src="https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.jpg" alt="SpringAI SDK" width="1024" height="576" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;h3 id="step-1-add-the-ai-model-and-agentcore-memory-dependencies"&gt;Step 1: Add the Ai model and AgentCore memory dependencies&lt;/h3&gt;&#10;&lt;pre class="EnlighterJSRAW" data-enlighter-language="xml"&gt;&amp;lt;dependency&amp;gt;&#10; &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;&#10; &amp;lt;artifactId&amp;gt;spring-ai-model&amp;lt;/artifactId&amp;gt;&#10;&amp;lt;/dependency&amp;gt;&#10;&amp;lt;dependency&amp;gt;&#10; &amp;lt;groupId&amp;gt;org.springaicommunity&amp;lt;/groupId&amp;gt;&#10; &amp;lt;artifactId&amp;gt;spring-ai-agentcore-memory&amp;lt;/artifactId&amp;gt;&#10;&amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;h3 id="step-2-create-shortlong-term-in-aws-management-console"&gt;Step 2: Create Short/Long Term in AWS Management Console&lt;/h3&gt;&#10;&lt;p&gt;&lt;em&gt;Navigate to &lt;strong&gt;Amazon Bedrock AgentCore &amp;gt; Memory&lt;/strong&gt; to create short/long-term memories.&lt;/em&gt;&#10;&lt;img src="https://foojay.io/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.jpg" alt="AgentCore Memory" width="1024" height="441" loading="lazy" decoding="async"&gt; AgentCore Memory&lt;/p&gt;</description></item><item><title>Explore Spring AI SDK - Amazon Bedrock AgentCore - Part 1</title><link>https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/</link><pubDate>Mon, 20 Apr 2026 13:44:54 +0000</pubDate><guid>https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Artificial intelligence has rapidly expanded across every industry since the inception of ChatGPT. It represents a breakthrough in how we build and use software. Moreover, this breakthrough technology has driven major transformation. At the same time, it has created significant noise and hype.&lt;/p&gt;&#10;&lt;p&gt;Today, AI is no longer experimental. Instead, it has become essential, much like electricity and the internet. As a result, it now plays a key role in our daily lives. Overall, this shift reflects strong technological acceleration across industries.&lt;/p&gt;</description></item><item><title>Spring Boot 3.5 EOL — The CVE Blind Spot Nobody Talks About</title><link>https://foojay.io/today/crossing-the-river-styx-spring-boot-3-5-and-the-zombie-dependency-problem/</link><pubDate>Sun, 19 Apr 2026 13:37:13 +0000</pubDate><guid>https://foojay.io/today/crossing-the-river-styx-spring-boot-3-5-and-the-zombie-dependency-problem/</guid><description>&lt;p&gt;Tomorrow I start (o so early) for &lt;a href="https://2026.europe.jcon.one/" target="_blank" rel="noopener noreferrer"&gt;JCON Europe&lt;/a&gt; in Cologne and then, at the tail end of the week, go to Devoxx France to give more talks. If you&amp;rsquo;re at either, come say hi. Herodevs has a booth at both.&lt;/p&gt;&#10;&lt;p&gt;After digging into the CVE stories behind &lt;a href="https://foojay.io/today/the-real-mechanics-of-vulnerabilities-in-an-upstream-downstream-topsy-turvy-eol-world/"&gt;Tomcat 8.5&amp;rsquo;s end of life&lt;/a&gt;, I turned my attention to Spring Boot 3.5. Same question, different framework: what &lt;em&gt;actually&lt;/em&gt; happens to your security posture when a project crosses the EOL line?&lt;/p&gt;</description></item><item><title>Spring I/O 2026: Field Notes from Barcelona</title><link>https://foojay.io/today/spring-i-o-2026-field-notes-from-barcelona/</link><pubDate>Fri, 17 Apr 2026 13:09:24 +0000</pubDate><guid>https://foojay.io/today/spring-i-o-2026-field-notes-from-barcelona/</guid><description>&lt;p&gt;Spring I/O 2026 wrapped in Barcelona on Wednesday. Three days at the Palau de Congressos. A thousand-plus developers, five tracks, sixty sessions (or there abouts) Here are the things I&amp;rsquo;m still thinking about..&lt;/p&gt;&#10;&lt;h2 id="agents-everywhere"&gt;Agents everywhere&lt;/h2&gt;&#10;&lt;p&gt;It was a Spring AI conference with a Spring Boot conference attached.&lt;/p&gt;&#10;&lt;p&gt;That&amp;rsquo;s not a complaint. Count the programme yourself. Across the two main days, roughly a third of the main-track sessions were about Spring AI, MCP, agents, or building on LLMs. Josh Long opened Day 2 at eleven with &lt;em&gt;Bootiful Spring Boot 4&lt;/em&gt; . By twelve, the Auditorium had moved on to &lt;em&gt;The Spring AI Ecosystem in 2026: From Foundations to Agents&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Building a Kotlin App with Spring Boot and MongoDB Search</title><link>https://foojay.io/today/building-a-kotlin-app-with-spring-boot-and-mongodb-search/</link><pubDate>Thu, 09 Apr 2026 15:21:05 +0000</pubDate><guid>https://foojay.io/today/building-a-kotlin-app-with-spring-boot-and-mongodb-search/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/b0dkQYcvBkQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;p&gt;One of my favorite activities is traveling and exploring the world. You know that feeling of discovering a new place and thinking, &amp;ldquo;How have I not been here before?&amp;rdquo; It&amp;rsquo;s with that sensation that I&amp;rsquo;m always motivated to seek out new places to discover. Often, when searching for a place to stay, we&amp;rsquo;re not entirely sure what we&amp;rsquo;re looking for or what experiences we&amp;rsquo;d like to have. For example, we might want to rent a room in a city with a view of a castle. Finding something like that can seem difficult, right? However, there is a way to search for information accurately using MongoDB Search.&lt;/p&gt;</description></item><item><title>Manage HTTP Sessions with Spring Session MongoDB</title><link>https://foojay.io/today/building-distributed-http-sessions-with-spring-session-mongodb/</link><pubDate>Tue, 07 Apr 2026 15:19:10 +0000</pubDate><guid>https://foojay.io/today/building-distributed-http-sessions-with-spring-session-mongodb/</guid><description>&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/drivers/java/sync/current/integrations/spring-session/?utm_campaign=devrel&amp;amp;utm_source=third-part-content&amp;amp;utm_medium=cta&amp;amp;utm_content=spring&amp;#43;sessions&amp;#43;mongodb&amp;amp;utm_term=tim.kelly" target="_blank" rel="noopener noreferrer"&gt;Spring Session MongoDB&lt;/a&gt; is a library that enables Spring applications to store and manage HTTP session data in MongoDB rather than relying on container-specific session storage. In traditional deployments, session state is often tied to a single application instance, which makes scaling across multiple servers difficult. By integrating &lt;a href="https://spring.io/projects/spring-session" target="_blank" rel="noopener noreferrer"&gt;Spring Session&lt;/a&gt; with MongoDB, session data can be persisted beyond application restarts and shared across instances in a cluster, enabling scalable distributed applications with minimal configuration.&lt;/p&gt;</description></item><item><title>Grails Is Back: Inside the Apache Software Foundation Migration</title><link>https://foojay.io/today/grails-isnt-done-yet-part-2-eol-spring-boot-and-what-comes-next/</link><pubDate>Wed, 01 Apr 2026 08:48:56 +0000</pubDate><guid>https://foojay.io/today/grails-isnt-done-yet-part-2-eol-spring-boot-and-what-comes-next/</guid><description>&lt;h2 id="grails-isnt-done-yet-part-2-eol-spring-boot-and-what-comes-next"&gt;Grails Isn&amp;rsquo;t Done Yet (Part 2): EOL, Spring Boot, and What Comes Next&lt;/h2&gt;&#10;&lt;p&gt;In the &lt;a href="https://foojay.io/today/grails-isnt-done-yet-part-1-inside-the-asf-reboot/"&gt;companion article&lt;/a&gt; to this one, I looked at the revitalisation of Grails under the Apache Software Foundation: the 18-month migration, the technical modernisation, and the release of Grails 7 as a Top-Level ASF Project. That is the good-news story, and it is a genuinely impressive piece of community engineering.&lt;/p&gt;&#10;&lt;p&gt;This article is about the other side of the same coin.&lt;/p&gt;</description></item><item><title>Spring Boot Actuator Health for MicroProfile Developers</title><link>https://foojay.io/today/spring-boot-actuator-health-for-microprofile-developers/</link><pubDate>Thu, 26 Mar 2026 09:30:00 +0000</pubDate><guid>https://foojay.io/today/spring-boot-actuator-health-for-microprofile-developers/</guid><description>&lt;p&gt;If you worked with MicroProfile Health, you already understand the value of exposing application health information through standardized endpoints. You know about liveness, readiness and startup probes. You implemented the HealthCheck interface and annotated your procedures with @Liveness, @Readiness and @Startup. Spring Boot Actuator follows a similar philosophy but takes a different architectural approach. This post will help you map your MicroProfile Health knowledge to Spring&amp;rsquo;s world.&lt;/p&gt;&#10;&lt;h2 id="the-conceptual-bridgethe-conceptual-bridge"&gt;The Conceptual BridgeThe Conceptual Bridge&lt;/h2&gt;&#10;&lt;p&gt;At its core, Spring Boot Actuator serves the same purpose as MicroProfile Health: it provides a mechanism for validating the availability and status of your application in containerized environments. Both specifications recognize that modern cloud platforms like Kubernetes need machine-readable health information to make decisions about pod lifecycle management.&lt;/p&gt;</description></item><item><title>Grails Is Back: Inside the Apache Software Foundation Migration</title><link>https://foojay.io/today/grails-isnt-done-yet-part-1-inside-the-asf-reboot/</link><pubDate>Wed, 25 Mar 2026 08:30:21 +0000</pubDate><guid>https://foojay.io/today/grails-isnt-done-yet-part-1-inside-the-asf-reboot/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Steve Poole | With contributions from James Fredley, Apache Grails PMC Chair&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;For a technology that many people filed under &amp;ldquo;legacy,&amp;rdquo; Grails has been unusually active. While much of the industry&amp;rsquo;s attention has drifted toward newer frameworks and shinier stacks, something more deliberate has been happening in the background.&lt;/p&gt;&#10;&lt;p&gt;Grails has been moving into the Apache Software Foundation (ASF), modernising and positioning itself for the next chapter.&lt;/p&gt;&#10;&lt;p&gt;If you have not looked at Grails recently, your mental model is likely several years out of date. And that, in many ways, is exactly the problem.&lt;/p&gt;</description></item><item><title>Introducing the BoxLang Spring Boot Starter: Dynamic JVM Templating for Spring</title><link>https://foojay.io/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/</link><pubDate>Thu, 19 Mar 2026 14:20:02 +0000</pubDate><guid>https://foojay.io/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/boxlang-spring-boot-release-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Spring Boot developers know the pain of evaluating view technologies. Thymeleaf is great — until you need more expressiveness. FreeMarker is powerful — until the syntax fights you. What if you could write templates in a dynamic JVM language that gives you the full power of the platform, feels natural, and requires zero setup to integrate?&lt;/p&gt;&#10;&lt;p&gt;Meet the &lt;strong&gt;BoxLang Spring Boot Starter.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Drop one dependency into your Spring Boot 3 app and start writing dynamic &lt;code&gt;.bxm&lt;/code&gt; templates powered by BoxLang — a modern, expressive JVM language. Zero configuration. Full web scopes. 100% Java interoperable. Not only that, you get full access to BoxLang&amp;rsquo;s framework capabilities so you can integrate tons of features into your Spring Boot applications:&lt;/p&gt;</description></item><item><title>No Keys, No LLM: Building a Wikidata Definition API with Embabel</title><link>https://foojay.io/today/embabel-spring-boot-wikidata-definition-api/</link><pubDate>Thu, 05 Mar 2026 08:00:25 +0000</pubDate><guid>https://foojay.io/today/embabel-spring-boot-wikidata-definition-api/</guid><description>&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;I built a &lt;strong&gt;Spring Boot 4&lt;/strong&gt; API that defines terms via &lt;strong&gt;Wikidata&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;The app is fully reproducible: &lt;strong&gt;no API keys&lt;/strong&gt; and &lt;strong&gt;no model installation&lt;/strong&gt; needed.&lt;/li&gt;&#10;&lt;li&gt;Embabel orchestrates the pipeline as a sequence of actions to achieve the goal &lt;code&gt;DefinitionResult&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;The logs show planning, execution, and typed object binding—the most useful part for teaching agentic flows.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TiuYS6K3HaU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;h2 id="no-keys-no-llm-building-a-wikidata-definition-api-with-embabel"&gt;No Keys, No LLM: Building a Wikidata Definition API with Embabel&lt;/h2&gt;&#10;&lt;p&gt;I wanted a demo that is &lt;strong&gt;simple&lt;/strong&gt; , &lt;strong&gt;reproducible&lt;/strong&gt; , and still &lt;strong&gt;shows agentic orchestration&lt;/strong&gt; in a way that&amp;rsquo;s easy to explain on video.&lt;/p&gt;</description></item><item><title>Tomcat TLSv1.3 cipher configuration</title><link>https://foojay.io/today/tomcat-tlsv13-cipher-configuration-spring-boot/</link><pubDate>Thu, 26 Feb 2026 18:02:34 +0000</pubDate><guid>https://foojay.io/today/tomcat-tlsv13-cipher-configuration-spring-boot/</guid><description>&lt;p&gt;A recent update to Apache Tomcat introduced a subtle but significant change to how TLS cipher suites are configured. If your Spring Boot application explicitly configures TLS ciphers, particularly TLSv1.3 ciphers, and runs on Tomcat 9.0.115+ (Spring Boot 2.x), 10.1.52+ (Spring Boot 3.x), or 11.0.18+ (Spring Boot 4.x), your cipher configuration may be silently ignored.&lt;/p&gt;&#10;&lt;p&gt;Prior to the change, Tomcat used a single &lt;code&gt;ciphers&lt;/code&gt; attribute on the SSL connector to configure cipher suites for all TLS versions. Starting with the versions of Tomcat listed above (Tomcat &lt;a href="https://github.com/apache/tomcat/commit/9abf6bddb2e84ecf1668780bb3150b799f832ccf" target="_blank" rel="noopener noreferrer"&gt;commit&lt;/a&gt;), this attribute was split:&lt;/p&gt;</description></item><item><title>Machine Learning in Java - SPAM detection using ONNX</title><link>https://foojay.io/today/machine-learning-based-spam-detection-using-onnx-in-java/</link><pubDate>Tue, 10 Feb 2026 06:51:50 +0000</pubDate><guid>https://foojay.io/today/machine-learning-based-spam-detection-using-onnx-in-java/</guid><description>&lt;p&gt;Believe it or not, it is possible to do Machine Learning in Java. In this article I go over how to implement a Spring Boot API for Spam Detection using an advanced anti-spam model from the &lt;a href="https://huggingface.co/onnx-community/models" target="_blank" rel="noopener noreferrer"&gt;Hugging Face onnx-community&lt;/a&gt; and Microsoft&amp;rsquo;s &lt;a href="https://onnxruntime.ai/docs/get-started/with-java.html" target="_blank" rel="noopener noreferrer"&gt;ONNX Runtime for Java&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;We will package the API up as a Docker image which we can run a container from using docker or podman, and I guess in theory you could deploy on your Kubernetes cluster, if you (are) fancy.&lt;/p&gt;</description></item><item><title>Testing Emails with Testcontainers and Mailpit</title><link>https://foojay.io/today/testing-emails-with-testcontainers-and-mailpit/</link><pubDate>Thu, 29 Jan 2026 08:38:10 +0000</pubDate><guid>https://foojay.io/today/testing-emails-with-testcontainers-and-mailpit/</guid><description>&lt;p&gt;Testing email functionality is often painful. SMTP servers are external, tests become slow or flaky, and local setups differ from CI environments. As a result, many teams either mock the mail sender or skip proper email tests completely.&lt;/p&gt;&#10;&lt;p&gt;Both approaches are unsatisfying. Mocking does not test real behavior, and shared SMTP servers introduce hidden dependencies. What we really want is a real SMTP server that runs locally and in CI, is fully isolated per test run, and allows us to inspect sent emails easily.&lt;/p&gt;</description></item><item><title>Introduction to Behavior Driving Development with Java and MongoDB</title><link>https://foojay.io/today/introduction-to-behavior-driving-development-with-java-and-mongodb/</link><pubDate>Tue, 27 Jan 2026 16:35:53 +0000</pubDate><guid>https://foojay.io/today/introduction-to-behavior-driving-development-with-java-and-mongodb/</guid><description>&lt;p&gt;When we face software development, the biggest mistake is about delivering what the client wants. It sounds like a cliché, but after decades, we are still facing this problem. One good way to solve it is to start the test focusing on what the business needs.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Behavior-driven development&lt;/strong&gt; (BDD) is a software development methodology where the focus is on behavior and the domain terminology or ubiquitous language. It utilizes a shared, natural language to define and test software behaviors from the user&amp;rsquo;s perspective. BDD builds upon test-driven development (TDD) by focusing on scenarios that are relevant to the business. These scenarios are written as plain-language specifications that can be automated as tests, simultaneously serving as living documentation.&lt;/p&gt;</description></item><item><title>Spring Boot 4 - OpenTelemetry Guide</title><link>https://foojay.io/today/spring-boot-4-opentelemetry-explained/</link><pubDate>Wed, 10 Dec 2025 09:09:58 +0000</pubDate><guid>https://foojay.io/today/spring-boot-4-opentelemetry-explained/</guid><description>&lt;p&gt;In my previous &lt;a href="https://foojay.io/today/preparing-for-spring-framework-7-and-spring-boot-4/"&gt;article&lt;/a&gt;, I outlined a comprehensive list of features introduced in Spring Framework 7 and Spring Boot 4.&lt;/p&gt;&#10;&lt;p&gt;In this series of articles, we will explore these features in detail using a pragmatic approach. In this second article, I will dive deep into integration of Observability framework i.e., &lt;em&gt;&lt;strong&gt;OpenTelemetry with SpringBoot&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;As an architect and developer, when I engage in system design—whether it involves monolithic architecture, microservices, or contemporary cloud-native applications—I have made the integration of &lt;strong&gt;observability&lt;/strong&gt; patterns utilizing &lt;strong&gt;open-telemetry&lt;/strong&gt; tools a standard practice. Through observability, we can monitor application behavior via &lt;strong&gt;metrics, logs, and traces&lt;/strong&gt; that we trigger&lt;/p&gt;</description></item><item><title>From Spring Boot To Jakarta EE 11</title><link>https://foojay.io/today/from-spring-boot-to-jakarta-ee-11-how-payara-starter-eases-the-transition/</link><pubDate>Fri, 28 Nov 2025 08:11:53 +0000</pubDate><guid>https://foojay.io/today/from-spring-boot-to-jakarta-ee-11-how-payara-starter-eases-the-transition/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been living in the Spring ecosystem, you&amp;rsquo;re used to fast project setup. Spring Initializr gives you a sleek interface, some starter dependencies and a running project within minutes. Now you&amp;rsquo;re moving to Jakarta EE, where do you begin?&lt;/p&gt;&#10;&lt;p&gt;In this blog, you&amp;rsquo;ll see how Spring developers &lt;strong&gt;can create Jakarta EE applications with the same ease they&amp;rsquo;re used to from Spring Initializr.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Let&amp;rsquo;s be honest: Spring Boot abstracts away so much of the setup pain that you forget it&amp;rsquo;s even there. You don&amp;rsquo;t worry about the underlying servlet container, dependency versions or deployment descriptors, as Spring Boot handles it all.&lt;/p&gt;</description></item><item><title>Spring Framework 7.0 Jakarta EE 11 Compatibility</title><link>https://foojay.io/today/spring-framework-7-0-and-spring-data-2025-1-0-embrace-jakarta-ee-11-compatibility/</link><pubDate>Fri, 21 Nov 2025 13:50:47 +0000</pubDate><guid>https://foojay.io/today/spring-framework-7-0-and-spring-data-2025-1-0-embrace-jakarta-ee-11-compatibility/</guid><description>&lt;p&gt;The recent releases of&lt;a href="https://spring.io/blog/2025/11/13/spring-framework-7-0-general-availability" title=" Spring Framework 7.0" target="_blank" rel="noopener noreferrer"&gt;Spring Framework 7.0&lt;/a&gt; and &lt;a href="https://spring.io/blog/2025/11/14/spring-data-2025-1-goes-ga" title="Spring Data 2025.1.0" target="_blank" rel="noopener noreferrer"&gt;Spring Data 2025.1.0&lt;/a&gt; mark an important milestone for the Java ecosystem, with both now aligned with &lt;a href="https://jakarta.ee/news/jakarta-ee-11-released/" title="Jakarta EE 11" target="_blank" rel="noopener noreferrer"&gt;Jakarta EE 11&lt;/a&gt;. This compatibility represents a continued convergence between the two major Enterprise Java Platforms.&lt;/p&gt;&#10;&lt;h2 id="why-this-matters"&gt;Why This Matters&lt;/h2&gt;&#10;&lt;p&gt;Compatibility with Jakarta EE 11 ensures that Spring applications can integrate more naturally with modern Jakarta runtimes, including Payara Platform. This leads to improvements such as:&lt;/p&gt;</description></item><item><title>Micrometer &amp; Prometheus in Spring Boot: Kafka Burger Orders</title><link>https://foojay.io/today/micrometer-prometheus-in-spring-boot-kafka-burger-orders/</link><pubDate>Fri, 14 Nov 2025 10:13:03 +0000</pubDate><guid>https://foojay.io/today/micrometer-prometheus-in-spring-boot-kafka-burger-orders/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/eSreg0xPGqo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;p&gt;👨‍💻 GitHub: &lt;a href="https://github.com/vinny59200/dukeburger" target="_blank" rel="noopener noreferrer"&gt;https://github.com/vinny59200/dukeburger&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;🔵⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪&lt;/p&gt;&#10;&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;&#10;&lt;p&gt;This guide shows how to use &lt;strong&gt;Micrometer and Prometheus in Spring Boot&lt;/strong&gt; to track a custom metric for a Kafka-driven Burger Orders app. You&amp;rsquo;ll post a burger order to a REST endpoint, publish it to Kafka, consume the topic, and increment a counter for all &amp;ldquo;DukeBurger&amp;rdquo; orders. Copy the snippets, run, and you&amp;rsquo;ll see your metric on &lt;code&gt;/actuator/prometheus&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>