<?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>Fri, 23 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://foojay.io/today/category/spring/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Secure a Spring Boot Application with OpenID Connect and pac4j</title><link>https://foojay.io/today/how-to-secure-a-spring-boot-application-with-openid-connect-and-pac4j/</link><pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/how-to-secure-a-spring-boot-application-with-openid-connect-and-pac4j/</guid><description>&lt;p&gt;&lt;a href="https://www.pac4j.org/" target="_blank" rel="noopener noreferrer"&gt;pac4j&lt;/a&gt; is an open-source Java security library for authentication and authorization. It supports protocols such as OpenID Connect, OAuth 2.0, SAML and CAS, with integrations for multiple Java web frameworks. I am Jérôme LELEU, the maintainer of pac4j. In this tutorial, we will use its OpenID Connect client with Spring Boot.&lt;/p&gt;&#10;&lt;p&gt;You want users to sign in to your Java application with Keycloak, Google, Microsoft Entra ID, Okta, Auth0 or even a CAS server. They already have an account there, so your application should not ask them for another password.&lt;/p&gt;</description></item><item><title>Build Your First SaaS with MongoDB Ephemeral Clusters</title><link>https://foojay.io/today/build-your-first-saas-with-mongodb-ephemeral-clusters/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/build-your-first-saas-with-mongodb-ephemeral-clusters/</guid><description>&lt;p&gt;It&amp;rsquo;s a new world. A prototype that once meant hours or days of setup can now be up and running in minutes. With one API call, an AI agent can create a MongoDB Atlas cluster from your IDE, so you can start building without stopping to navigate account setup, cloud choices, regions, or cluster configuration.&lt;/p&gt;&#10;&lt;p&gt;In this tutorial, you will use an &lt;a href="https://www.mongodb.com/products/tools/atlas-ephemeral-clusters/" target="_blank" rel="noopener noreferrer"&gt;Atlas Ephemeral Cluster&lt;/a&gt; to build a polished job-application tracker: a small SaaS where a user manages applications on a Kanban board. The application is deliberately simple. The point is the workflow: give an agent a real database immediately, validate an idea quickly, and claim the cluster only when the prototype is worth keeping.&lt;/p&gt;</description></item><item><title>Lightweight Spring Boot Monitoring Without Prometheus and Grafana</title><link>https://foojay.io/today/lightweight-spring-boot-monitoring/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/lightweight-spring-boot-monitoring/</guid><description>&lt;p&gt;Running one Spring Boot application or a handful of them on a VPS still calls for basic operational visibility. You need to know whether an application is reachable, whether errors are rising, and whether it restarted. You may not need a complete monitoring platform to answer those questions.&lt;/p&gt;&#10;&lt;p&gt;Spring Boot Actuator already exposes much of that information through its health endpoint and Micrometer metrics. &lt;a href="https://github.com/PVRLabs/statlite" target="_blank" rel="noopener noreferrer"&gt;StatLite&lt;/a&gt; turns it into a focused dashboard for health, requests, errors, latency, memory, uptime, and restarts. It runs as one Go binary and stores its history in SQLite.&lt;/p&gt;</description></item><item><title>One Embedding per Job, or Two? Measuring Semantic Search in a Spring Boot Job Portal</title><link>https://foojay.io/today/embedding-strategies-job-search/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/embedding-strategies-job-search/</guid><description>&lt;p&gt;This job portal started as a practice project. I built it after college, mostly so I&amp;rsquo;d have something to put on my resume. Recently I picked it up again. I was job hunting myself, looking for a switch, and it struck me that I should develop it properly, and maybe even launch it someday.&lt;/p&gt;&#10;&lt;p&gt;The first thing that bothered me was search. The results just weren&amp;rsquo;t good, so I started reading about how to make them better.&lt;/p&gt;</description></item><item><title>What I Learned Building an AI Code Reviewer with Java and Spring Boot</title><link>https://foojay.io/today/what-i-learned-building-an-ai-code-reviewer-with-java-spring-boot/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/what-i-learned-building-an-ai-code-reviewer-with-java-spring-boot/</guid><description>&lt;p&gt;AI-assisted coding has changed how quickly developers can write software.&lt;/p&gt;&#10;&lt;p&gt;But that creates another question:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;How do you review all that generated code effectively?&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;That question led me to build CodeGuard AI, a self-hosted AI code-review application for GitHub Pull Requests using Java and Spring Boot.&lt;/p&gt;&#10;&lt;p&gt;At first, the architecture seemed simple:&lt;/p&gt;&#10;&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;GitHub Pull Request&#10; ↓&#10; LLM&#10; ↓&#10; Review&lt;/pre&gt;&lt;p&gt;In practice, that wasn&amp;rsquo;t enough.&#10;The interesting engineering work was everything around the model: collecting useful Pull Request context, defining review instructions, structuring the model response, assessing findings, and integrating the result back into the GitHub workflow.&#10;This article explains what I learned while building that workflow.&lt;/p&gt;</description></item><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></channel></rss>