<?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://foojayio.github.io/website/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, 31 Jul 2026 11:36:10 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/spring/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Create a Spring Boot Fraud Scoring Service</title><link>https://foojayio.github.io/website/today/how-to-create-a-spring-boot-fraud-scoring-service/</link><pubDate>Fri, 31 Jul 2026 08:45:43 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&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://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</link><pubDate>Mon, 06 Jul 2026 03:39:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&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;
&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;
&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.
&lt;img src="https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/Exposed-1024x683.png" alt="Exposed" loading="lazy"&gt;
 Kotlin SQL Libary&lt;/p&gt;</description></item><item><title>You’re invited to IntelliJ IDEA Conf 2026!</title><link>https://foojayio.github.io/website/today/youre-invited-to-intellij-idea-conf-2026/</link><pubDate>Mon, 29 Jun 2026 18:35:08 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&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;
&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://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/</link><pubDate>Fri, 26 Jun 2026 07:28:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/jurassic-jdk-migrate-or-extinct/1_wul-KqE6vXk4ynnh_IljSQ-1-1024x562.webp" alt="" loading="lazy"&gt;
&lt;/p&gt;
&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;
&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;
&lt;h2 id="h2-0-why-are-we-still-here"&gt;Why Are We Still Here? 👀&lt;/h2&gt;
&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://foojayio.github.io/website/today/foojay-podcast-99/</link><pubDate>Mon, 22 Jun 2026 06:54:00 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&lt;h2 id="h2-0-youtube"&gt;YouTube&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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;
		&lt;/div&gt;

&lt;h2 id="h2-1-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&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://foojayio.github.io/website/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://foojayio.github.io/website/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;
&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://foojayio.github.io/website/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://foojayio.github.io/website/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://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/</link><pubDate>Sun, 10 May 2026 09:09:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;Part 1&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/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;
&lt;blockquote&gt;
&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;
{#https://github.com/bsmahi/simple-spring-boot-agent}.&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-3/AgentcoreBrowser.png" alt="AgentCore Built-In Tool Browser" loading="lazy"&gt;
 Built-In Tool Browser&lt;/p&gt;
&lt;/blockquote&gt;
&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://foojayio.github.io/website/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://foojayio.github.io/website/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;
&lt;h2 id="h2-0-the-problem"&gt;The problem&lt;/h2&gt;
&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://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/</link><pubDate>Mon, 27 Apr 2026 09:09:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/</guid><description>&lt;br /&gt;
&lt;p&gt;&lt;em&gt;If you&amp;rsquo;re joining us from &lt;a href="https://foojayio.github.io/website/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;
&lt;em&gt;Generated using Notebook LLM for my previous &lt;a href="https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/"&gt;article&lt;/a&gt;
{#https://foojay.io/today/spring-ai-amazon-bedrock-sdk-guide/}&lt;/em&gt;&lt;/p&gt;
&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;
&lt;img src="https://a.b.cdn.console.awsstatic.com/a/v1/ACHOUHHJ3XZF7J5AYP2XIR2NCZIPH56WAM33AFJA44HJSRMAO4DA/assets/images/Overview/ac_overviewchart_04_07.png" alt="" loading="lazy"&gt;
 &lt;em&gt;&lt;strong&gt;Source: Amazon&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To begin, enable &lt;strong&gt;AgentCore memory&lt;/strong&gt; for the agent you built earlier.&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/SpringAISDK.png" alt="SpringAI SDK" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="h3-0-step-1-add-the-ai-model-and-agentcore-memory-dependencies"&gt;Step 1: Add the Ai model and AgentCore memory dependencies&lt;/h3&gt;
&lt;br /&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;spring-ai-model&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;org.springaicommunity&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;spring-ai-agentcore-memory&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/pre&gt;
&lt;h3 id="h3-1-step-2-create-short-long-term-in-aws-management-console"&gt;Step 2: Create Short/Long Term in AWS Management Console&lt;/h3&gt;
&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;
&lt;img src="https://foojayio.github.io/website/today/explore-spring-ai-sdk-amazon-bedrock-agentcore-part-2/AgentCoreMemory-1024x441.png" alt="AgentCore Memory" loading="lazy"&gt;
 AgentCore Memory&lt;/p&gt;</description></item><item><title>Explore Spring AI SDK - Amazon Bedrock AgentCore - Part 1</title><link>https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/</link><pubDate>Mon, 20 Apr 2026 13:44:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-ai-amazon-bedrock-sdk-guide/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&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;
&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://foojayio.github.io/website/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://foojayio.github.io/website/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;
&lt;p&gt;After digging into the CVE stories behind &lt;a href="https://foojayio.github.io/website/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://foojayio.github.io/website/today/spring-i-o-2026-field-notes-from-barcelona/</link><pubDate>Fri, 17 Apr 2026 13:09:24 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&lt;h2 id="h2-0-agents-everywhere"&gt;Agents everywhere&lt;/h2&gt;
&lt;p&gt;It was a Spring AI conference with a Spring Boot conference attached.&lt;/p&gt;
&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://foojayio.github.io/website/today/building-a-kotlin-app-with-spring-boot-and-mongodb-search/</link><pubDate>Thu, 09 Apr 2026 15:21:05 +0000</pubDate><guid>https://foojayio.github.io/website/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;
			&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;
		&lt;/div&gt;

&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://foojayio.github.io/website/today/building-distributed-http-sessions-with-spring-session-mongodb/</link><pubDate>Tue, 07 Apr 2026 15:19:10 +0000</pubDate><guid>https://foojayio.github.io/website/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://foojayio.github.io/website/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://foojayio.github.io/website/today/grails-isnt-done-yet-part-2-eol-spring-boot-and-what-comes-next/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/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;
&lt;p&gt;This article is about the other side of the same coin.&lt;/p&gt;
&lt;p&gt;While Grails moves forward, many of the applications built on it cannot move at the same pace. The result is a growing gap between where the framework is heading and where a significant number of production systems actually sit. Understanding that gap, and what options exist for managing it, is what this piece is about.&lt;/p&gt;</description></item><item><title>Spring Boot Actuator Health for MicroProfile Developers</title><link>https://foojayio.github.io/website/today/spring-boot-actuator-health-for-microprofile-developers/</link><pubDate>Thu, 26 Mar 2026 09:30:00 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&lt;h2 id="h2-0-the-conceptual-bridgethe-conceptual-bridge"&gt;The Conceptual BridgeThe Conceptual Bridge&lt;/h2&gt;
&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://foojayio.github.io/website/today/grails-isnt-done-yet-part-1-inside-the-asf-reboot/</link><pubDate>Wed, 25 Mar 2026 08:30:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/grails-isnt-done-yet-part-1-inside-the-asf-reboot/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Steve Poole | With contributions from James Fredley, Apache Grails PMC Chair&lt;/p&gt;
&lt;/blockquote&gt;
&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;
&lt;p&gt;Grails has been moving into the Apache Software Foundation (ASF), modernising and positioning itself for the next chapter.&lt;/p&gt;
&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://foojayio.github.io/website/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://foojayio.github.io/website/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/introducing-the-boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/boxlang-spring-boot-release-700x467.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Spring Boot developers know the pain of evaluating view technologies. Thymeleaf is great &amp;mdash; until you need more expressiveness. FreeMarker is powerful &amp;mdash; 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;
&lt;p&gt;Meet the &lt;strong&gt;BoxLang Spring Boot Starter.&lt;/strong&gt;&lt;/p&gt;
&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 &amp;mdash; 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://foojayio.github.io/website/today/embabel-spring-boot-wikidata-definition-api/</link><pubDate>Thu, 05 Mar 2026 08:00:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/embabel-spring-boot-wikidata-definition-api/</guid><description>&lt;h2 id="h2-0-tl-dr"&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&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;
&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;
&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;
&lt;li&gt;The logs show planning, execution, and typed object binding&amp;mdash;the most useful part for teaching agentic flows.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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;
		&lt;/div&gt;

&lt;br /&gt;
&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://foojayio.github.io/website/today/tomcat-tlsv13-cipher-configuration-spring-boot/</link><pubDate>Thu, 26 Feb 2026 18:02:34 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&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://foojayio.github.io/website/today/machine-learning-based-spam-detection-using-onnx-in-java/</link><pubDate>Tue, 10 Feb 2026 06:51:50 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&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://foojayio.github.io/website/today/testing-emails-with-testcontainers-and-mailpit/</link><pubDate>Thu, 29 Jan 2026 08:38:10 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&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://foojayio.github.io/website/today/introduction-to-behavior-driving-development-with-java-and-mongodb/</link><pubDate>Tue, 27 Jan 2026 16:35:53 +0000</pubDate><guid>https://foojayio.github.io/website/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;
&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://foojayio.github.io/website/today/spring-boot-4-opentelemetry-explained/</link><pubDate>Wed, 10 Dec 2025 09:09:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-4-opentelemetry-explained/</guid><description>&lt;p&gt;In my previous &lt;a href="https://foojayio.github.io/website/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;
&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;
&lt;p&gt;As an architect and developer, when I engage in system design&amp;mdash;whether it involves monolithic architecture, microservices, or contemporary cloud-native applications&amp;mdash;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://foojayio.github.io/website/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://foojayio.github.io/website/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;
&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;
&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://foojayio.github.io/website/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://foojayio.github.io/website/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;
&lt;h2 id="h2-0-why-this-matters"&gt;Why This Matters&lt;/h2&gt;
&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://foojayio.github.io/website/today/micrometer-prometheus-in-spring-boot-kafka-burger-orders/</link><pubDate>Fri, 14 Nov 2025 10:13:03 +0000</pubDate><guid>https://foojayio.github.io/website/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;
			&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;
		&lt;/div&gt;

&lt;br /&gt;
&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;
&lt;hr&gt;
&lt;p&gt;🔵⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪&lt;/p&gt;
&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><item><title>Spring Framework 7 API Versioning Explained</title><link>https://foojayio.github.io/website/today/explore-spring-framework-7-features-api-versioning/</link><pubDate>Wed, 29 Oct 2025 06:45:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/explore-spring-framework-7-features-api-versioning/</guid><description>&lt;p&gt;In my previous &lt;a href="https://foojayio.github.io/website/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;
&lt;p&gt;In this series of articles, we will explore these features in detail using a pragmatic approach. To begin, I will deep dive into the &lt;em&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;&lt;strong&gt;versioning&lt;/strong&gt;&lt;/em&gt; feature introduced in Spring Framework 7.
&lt;img src="https://foojayio.github.io/website/today/explore-spring-framework-7-features-api-versioning/Sb4version_1.png" alt="API Versioning" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Any architectural or feature change stems from evolving business requirements, and API versioning is no exception. In today&amp;rsquo;s app-driven ecosystem, APIs are central to product integration and user experience.&lt;/p&gt;</description></item><item><title>Transactions and ThreadLocal in Spring</title><link>https://foojayio.github.io/website/today/transactions-and-threadlocal-in-spring/</link><pubDate>Tue, 21 Oct 2025 13:27:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/transactions-and-threadlocal-in-spring/</guid><description>&lt;p&gt;Two years ago, my friend José Paumard held the talk &amp;ldquo;Concurrent and Asynchronous Programming : Loom&amp;rdquo; at the Geneva Java User Group.&lt;/p&gt;
&lt;p&gt;In his talk, he mentioned that the Spring team would need to completely redesign their approach to transactions: his reasoning was that the transactions are implemented on top of &lt;code&gt;ThreadLocal&lt;/code&gt; object and Loom&amp;rsquo;s virtual threads break this approach.&lt;/p&gt;
&lt;p&gt;I was intrigued because though I used Spring transactions a lot via the &lt;code&gt;@Transactional&lt;/code&gt; annotation, I never opened thought about looking at their implementation.&lt;/p&gt;</description></item><item><title>Beyond Keywords: Implementing Semantic Search in Java With Spring Data (Part 1)</title><link>https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/</link><pubDate>Thu, 16 Oct 2025 13:39:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/</guid><description>&lt;p&gt;Building a semantic movie search app with embeddings and vector queries&lt;/p&gt;
&lt;p&gt;Have you ever tried to search for something such as a product, a song, or a movie but couldn&amp;rsquo;t quite remember its exact name? Maybe you recall only a clue&amp;mdash;a desert pyramid, a short melody, or &amp;ldquo;that ship that hit an iceberg.&amp;rdquo; Keyword search struggles with that. Vector search doesn&amp;rsquo;t: It lets you search by meaning.&lt;/p&gt;
&lt;p&gt;It works by turning text into embeddings, vectors (arrays of numbers) that capture semantic similarity, so results are ranked by what they mean, not just what they say.&lt;/p&gt;</description></item><item><title>Building REST APIs in Java with Spring Boot</title><link>https://foojayio.github.io/website/today/building-rest-apis-in-java-with-spring-boot/</link><pubDate>Tue, 09 Sep 2025 14:51:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-rest-apis-in-java-with-spring-boot/</guid><description>&lt;p&gt;REST has become the default choice for building web services, and for good reason. It&amp;rsquo;s straightforward to implement, easy for clients to consume, and built directly on top of the same principles of the web itself.&lt;/p&gt;
&lt;p&gt;HTTP already gives us well-defined methods (GET, POST, PUT, DELETE), built-in caching, redirect support, secure transport via TLS, and widespread tooling support across platforms. REST doesn&amp;rsquo;t reinvent the web&amp;mdash;it uses it.&lt;/p&gt;
&lt;p&gt;REST is not a protocol or a rigid standard. It&amp;rsquo;s a lightweight architectural approach that encourages scalable, evolvable, and interoperable services. Its creator, Roy Fielding, helped define many of the specs that underpin the web today.&lt;/p&gt;</description></item><item><title>Copy of Queryable Encryption with Spring Data MongoDB: How to Query Encrypted Fields</title><link>https://foojayio.github.io/website/today/queryable-encryption-with-spring-data-mongodb-how-to-query-encrypted-fields/</link><pubDate>Tue, 02 Sep 2025 19:00:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/queryable-encryption-with-spring-data-mongodb-how-to-query-encrypted-fields/</guid><description>&lt;p&gt;Information is one of the most valuable assets in computing and keeping it protected is even more critical. When we talk about data protection, it&amp;rsquo;s not just about preventing breaches or leaks; it&amp;rsquo;s also about complying with privacy regulations and protecting user data.&lt;/p&gt;
&lt;p&gt;MongoDB provides strong encryption capabilities, including in transit, at rest, and in use. The Queryable Encryption feature falls into the &lt;em&gt;in use&lt;/em&gt; category. It allows data to be encrypted on the client side, so that even with access to the database and its credentials, no one can read the protected fields without the proper encryption key. At the same time, it supports querying over encrypted fields, making it possible to filter, match, or retrieve data without compromising confidentiality.&lt;/p&gt;</description></item><item><title>OpenTelemetry Tracing on the JVM</title><link>https://foojayio.github.io/website/today/opentelemetry-tracing-on-the-jvm/</link><pubDate>Sun, 17 Aug 2025 08:00:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/opentelemetry-tracing-on-the-jvm/</guid><description>&lt;p&gt;You may know I&amp;rsquo;m a big fan of OpenTelemetry. I recently finished developing a &lt;a href="https://yowcon.com/melbourne-2025/masterclasses/560/gain-practical-in-depth-experience-with-observability-using-opentelemetry" target="_blank" rel="noopener noreferrer"&gt;master class for the YOW! conference&lt;/a&gt;
 at the end of the year. During development, I noticed massive differences in configuration and results across programming languages. Even worse, differences exist across frameworks inside the same programming language.&lt;/p&gt;
&lt;p&gt;In this post, I want to compare the different zero-code OpenTelemetry approaches on the JVM, covering the most widespread:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Boot with Micrometer Tracing&lt;/li&gt;
&lt;li&gt;Spring Boot with the OpenTelemetry Agent&lt;/li&gt;
&lt;li&gt;OpenTelemetry Spring Boot Starter&lt;/li&gt;
&lt;li&gt;Quarkus&lt;/li&gt;
&lt;li&gt;Quarkus with the OpenTelemetry Agent&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-commonalities"&gt;Commonalities&lt;/h2&gt;
&lt;p&gt;I keep the architecture pretty simple:&lt;/p&gt;</description></item><item><title>Preparing for Spring Boot 4 and Spring Framework 7: What’s New?</title><link>https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/</link><pubDate>Mon, 11 Aug 2025 14:42:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/</guid><description>&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m a passionate Spring Framework and Spring Boot enthusiast, and I always look forward to exploring and experimenting with the latest features and improvements they introduce. With Spring Boot 4 and Spring Boot Framework 7 right around the corner, now&amp;rsquo;s the perfect time to dive into the key enhancements that will shape the future of modern Java and enterprise application development.&lt;/strong&gt;
&lt;img src="https://foojayio.github.io/website/today/preparing-for-spring-framework-7-and-spring-boot-4/SpringImage.jpg" alt="Spring Boot 4" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In this blog post, we will discuss some key features enhanced as part of Spring Framework 7 and Spring Boot 4.&lt;/p&gt;</description></item><item><title>Agent Memory with Spring AI &amp; Redis</title><link>https://foojayio.github.io/website/today/agent-memory-with-spring-ai-redis/</link><pubDate>Wed, 23 Jul 2025 16:34:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/agent-memory-with-spring-ai-redis/</guid><description>&lt;h3 id="h3-0-you-re-building-an-ai-agent-with-memory-using-spring-ai-and-redis-unlike-traditional-chatbots-that-forget-previous-interactions-memory-enabled-agents-can-recall-past-conversations-and-facts-it-works-by-storing-two-types-of-memory-in-redis-short-term-conversation-history-and-long-term-facts-and-experiences-as-vectors-allowing-agents-to-provide-personalized-context-aware-responses"&gt;&lt;strong&gt;You&amp;rsquo;re building an AI agent with memory using Spring AI and Redis.&lt;/strong&gt; &lt;strong&gt;Unlike traditional chatbots that forget previous interactions, memory-enabled agents can recall past conversations and facts.&lt;/strong&gt; &lt;strong&gt;It works by storing two types of memory in Redis: short-term (conversation history) and long-term (facts and experiences as vectors), allowing agents to provide personalized, context-aware responses.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;LLMs respond to each message in isolation, treating every interaction as if it&amp;rsquo;s the first time they&amp;rsquo;ve spoken with a user. They lack the ability to remember previous conversations, preferences, or important facts.&lt;/p&gt;</description></item><item><title>Spring Cloud Stream for Real-Time Event-Driven Systems</title><link>https://foojayio.github.io/website/today/spring-cloud-stream-event-driven-architecture-part-1/</link><pubDate>Mon, 21 Jul 2025 13:33:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-cloud-stream-event-driven-architecture-part-1/</guid><description>&lt;p&gt;&lt;strong&gt;Envision operating a successful e-commerce platform where every moment is crucial. Customers make purchases, adjust inventory levels, process payments, and dispatch shipping alerts&amp;mdash;all in real time. In the background, microservices diligently function to guarantee seamless operations. However, how do these services interact effectively, particularly during peak traffic occurrences such as flash sales or holiday shopping events?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An efficient method to execute this use case involves utilizing Spring Cloud Stream (SCS) as the messaging infrastructure. SCS facilitates seamless interaction among microservices, enhancing the system&amp;rsquo;s responsiveness and scalability. A significant benefit of SCS is that it provides an abstraction layer, allowing developers to transition between messaging technologies such as Kafka or RabbitMQ or Pulsar or Amazon Kinesis without altering their fundamental business logic.&lt;/p&gt;</description></item><item><title>Spring Boot documentation with Redocusaurus</title><link>https://foojayio.github.io/website/today/spring-boot-api-documentation-redocusaurus/</link><pubDate>Wed, 16 Jul 2025 06:45:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-api-documentation-redocusaurus/</guid><description>&lt;h4 id="create-clear-and-interactive-api-documentation-quickly"&gt;&lt;em&gt;Create clear and interactive API documentation quickly.&lt;/em&gt;&lt;/h4&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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/fs6wiUqJGo8?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;
		&lt;/div&gt;

&lt;br /&gt;
&lt;hr&gt;
&lt;h4 id="heading"&gt;🔵⚪⚪⚪⚪⚪⚪⚪&lt;/h4&gt;
&lt;h3 id="h3-0-introduction-why-use-redocusaurus-for-spring-boot"&gt;📘 Introduction: Why Use Redocusaurus for Spring Boot?&lt;/h3&gt;
&lt;h4 id="discover-why-clean-api-docs-matter-and-how-redocusaurus-makes-it-easy"&gt;&lt;em&gt;Discover why clean API docs matter and how Redocusaurus makes it easy.&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Firstly&lt;/strong&gt;, clear API documentation is very important.&lt;/p&gt;
&lt;p&gt;It helps users understand your API better. This is true whether your API is for coworkers or external users.&lt;/p&gt;</description></item><item><title>SpringBoot and Kafka Streams – Event Routing &amp; Testing</title><link>https://foojayio.github.io/website/today/spring-boot-kafka-streams-event-routing-testing/</link><pubDate>Thu, 19 Jun 2025 08:37:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-kafka-streams-event-routing-testing/</guid><description>&lt;p&gt;Welcome to this hands-on guide to building a Spring Boot Kafka Streams application! (SpringBoot and Kafka Streams).&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;ll walk you through a project I built during the first day of a three-day Kafka Streams training. The goal? Validate sightseeing events in Lille based on predefined timetables and route the data accordingly.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s explore how Kafka Streams powers a real-time city tour experience! 🧭&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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/s07d3SmoBMI?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;
		&lt;/div&gt;

&lt;br /&gt;
&lt;hr&gt;
&lt;p&gt;🔵⚪⚪⚪⚪⚪⚪⚪⚪⚪&lt;/p&gt;</description></item><item><title>How to send prompts in bulk with Spring AI and Virtual Threads</title><link>https://foojayio.github.io/website/today/how-to-send-prompts-in-bulk-with-spring-ai-and-java-virtual-threads/</link><pubDate>Wed, 21 May 2025 09:18:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-send-prompts-in-bulk-with-spring-ai-and-java-virtual-threads/</guid><description>&lt;blockquote&gt;
&lt;p&gt;TL;DR: You&amp;rsquo;re building an AI-powered app that needs to send lots of prompts to OpenAI.&lt;/p&gt;
&lt;p&gt;Instead of sending them one by one, you want to do it in bulk &amp;mdash; efficiently and safely.&lt;/p&gt;
&lt;p&gt;This is how you can use Spring AI with Java Virtual Threads to process hundreds of prompts in parallel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When calling LLM APIs like OpenAI, you&amp;rsquo;re dealing with a high-latency, network-bound task. Normally, doing that in a loop slows you down and blocks threads. But with Spring AI and Java 21 Virtual Threads, you can fire off hundreds of requests in parallel without killing your app.&lt;/p&gt;</description></item><item><title>How to Deploy a Vaadin Application as a WAR on Tomcat 11</title><link>https://foojayio.github.io/website/today/how-to-deploy-a-vaadin-application-as-a-war-on-tomcat-11/</link><pubDate>Mon, 19 May 2025 07:40:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-deploy-a-vaadin-application-as-a-war-on-tomcat-11/</guid><description>&lt;p&gt;&lt;strong&gt;If you want to run a Vaadin application on an external servlet container like Apache Tomcat 11, you need to package your application as a WAR (Web Application Archive) instead of the usual executable JAR.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll show you step-by-step how I did it.&lt;/p&gt;
&lt;h2 id="h2-0-step-1-download-tomcat-11"&gt;Step 1: Download Tomcat 11&lt;/h2&gt;
&lt;p&gt;First, download Tomcat 11 from the &lt;a href="https://tomcat.apache.org/download-11.cgi" target="_blank" rel="noopener noreferrer"&gt;official Apache Tomcat website&lt;/a&gt;
. After extracting it to a local folder, you have a clean Tomcat installation ready to use.&lt;/p&gt;</description></item><item><title>GenAI blood, sweat, and tears: Loading data to Pinecone</title><link>https://foojayio.github.io/website/today/genai-blood-sweat-and-tears-loading-data-to-pinecone/</link><pubDate>Wed, 07 May 2025 22:10:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/genai-blood-sweat-and-tears-loading-data-to-pinecone/</guid><description>&lt;p&gt;As someone who is pretty familiar with relational and graph databases, I wanted to dig a little deeper into vector databases and understand the strengths and quirks they bring to the database table. I put together a conference abstract on vector RAG versus GraphRAG which got picked up, so I went to work building a demo and learning all I could.&lt;/p&gt;
&lt;p&gt;I pivoted a few times along the way, but ended up with a Spring AI application that connects to both Pinecone (vector database) and Neo4j (graph database). There were a few surprises throughout, which I&amp;rsquo;ll be sure to mention. Let&amp;rsquo;s get started!&lt;/p&gt;</description></item><item><title>Building FormPilot</title><link>https://foojayio.github.io/website/today/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/</link><pubDate>Tue, 06 May 2025 10:00:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-formpilot-my-journey-creating-an-ai-powered-form-filler-with-rag-langchain4j-and-ollama/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer: This article details an experimental project built for learning and demonstration purposes. The implementation described is not intended as production-grade solution. Some parts of the code were generated using JetBrains&amp;rsquo; AI Agent, &lt;a href="https://www.jetbrains.com/junie/" target="_blank" rel="noopener noreferrer"&gt;Junie&lt;/a&gt;
.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Have you ever found yourself filling out the same information on web forms over and over again? Name, email, address, phone number&amp;hellip; it&amp;rsquo;s tedious and time-consuming. As a developer who values efficiency, I decided to tackle this problem head-on by building FormPilot, an intelligent form filler that leverages the power of Large Language Models (LLMs) to fill out forms with contextually appropriate information automatically.&lt;/p&gt;</description></item><item><title>Local AI with Spring: Building Privacy-First Agents Using Ollama</title><link>https://foojayio.github.io/website/today/local-ai-with-spring-building-privacy-first-agents-using-ollama/</link><pubDate>Tue, 06 May 2025 06:44:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/local-ai-with-spring-building-privacy-first-agents-using-ollama/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Building local AI agents with Spring AI and Ollama has emerged as a game-changer for developers seeking to maintain complete control over their AI implementations and have access always at their fingertips, even offline.&lt;/p&gt;
&lt;p&gt;This powerful combination allows you to create sophisticated AI agents that run entirely on your own machine, are perfect for experimenting and learning concepts, while, more importantly, eliminating the need to share sensitive data with third-party services. While cloud-based AI services dominate headlines, they come with significant trade-offs: sending your data to third parties, paying per-token fees, and suffering latency penalties.&lt;/p&gt;</description></item><item><title>Improving Maven's dependency:analyze... or not</title><link>https://foojayio.github.io/website/today/improving-mavens-dependencyanalyze-or-not/</link><pubDate>Mon, 28 Apr 2025 08:28:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/improving-mavens-dependencyanalyze-or-not/</guid><description>&lt;p&gt;Recently, my good friend Richard Fichtner advised using the &lt;code&gt;mvn dependency:analyze&lt;/code&gt; command to get rid of declared but unused dependencies:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is another use case for&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mvn dependency:analyze&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It can show you the dependencies you use in your code but have not declared in your pom.xml. This works because you have a transitive dependency on your classpath. Either don&amp;rsquo;t use the dependency or declare it.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:cc2k5egfzqpf3nbjrs5xox4r/bafkreibztkdlkhrkyydfdntdkktrdw7qqr4t54mbwoazf6rkulcawhqkj4@jpeg" alt="" loading="lazy"&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&amp;mdash; &lt;a href="https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r?ref_src=embed" target="_blank" rel="noopener noreferrer"&gt;Richard Fichtner 💻☕ @richard.fichtner.dev&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed" target="_blank" rel="noopener noreferrer"&gt;December 10, 2024 at 2:00 PM&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Spring AI Debugging + How to Contribute to Open Source</title><link>https://foojayio.github.io/website/today/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/</link><pubDate>Wed, 02 Apr 2025 05:56:01 +0000</pubDate><guid>https://foojayio.github.io/website/today/breaktime-tech-talks-ep38-spring-ai-debugging-how-to-contribute-to-open-source/</guid><description>&lt;p&gt;In this episode, I continue my journey with vector databases, integrating &lt;a href="https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html" target="_blank" rel="noopener noreferrer"&gt;Pinecone&lt;/a&gt;
, &lt;a href="https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html" target="_blank" rel="noopener noreferrer"&gt;Neo4J&lt;/a&gt;
 , and &lt;a href="https://docs.spring.io/spring-ai/reference/index.html" target="_blank" rel="noopener noreferrer"&gt;Spring AI&lt;/a&gt;
. While making some progress, I also encountered hurdles, such as evolving APIs and the unique architecture of vector stores.&lt;/p&gt;
&lt;p&gt;Next, I share insights from &lt;a href="https://dzone.com/articles/why-and-how-to-participate-in-open-source-projects" target="_blank" rel="noopener noreferrer"&gt;an article on contributing to open-source source projects&lt;/a&gt;
, how it can accelerate your career and enhance both your technical and soft skills. From picking the right project to building credibility within the community, it&amp;rsquo;s a series of steps that gets better with time and practice!&lt;/p&gt;</description></item><item><title>Breaktime Tech Talks (Ep37): Vector Database Frustration + Microsoft LazyGraphRAG</title><link>https://foojayio.github.io/website/today/breaktime-tech-talks-ep37-vector-database-frustration-microsoft-lazygraphrag/</link><pubDate>Wed, 19 Mar 2025 12:54:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/breaktime-tech-talks-ep37-vector-database-frustration-microsoft-lazygraphrag/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This is episode 37 of the &lt;a href="https://www.youtube.com/playlist?list=PLzZ7iUdr2mwS6qexoz9dsI0NfnU614p1w" target="_blank" rel="noopener noreferrer"&gt;Breaktime Tech Talks&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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/hv-FtjIHg_I?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;
		&lt;/div&gt;

&lt;p&gt;You are listening to the Breaktime Tech Talks podcast, a bite-sized tech podcast for busy developers, where we&amp;rsquo;ll briefly cover technical topics, new snippets, and more in short time blocks. I&amp;rsquo;m your host, Jennifer Reif, an avid developer and problem solver with special interest in data, learning, and all things technology.&lt;/p&gt;</description></item><item><title>Spring Cloud Stream: Demystifying Event-Driven Architecture</title><link>https://foojayio.github.io/website/today/spring-cloud-stream-demystifying-event-driven-architecture/</link><pubDate>Fri, 28 Feb 2025 08:34:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-cloud-stream-demystifying-event-driven-architecture/</guid><description>&lt;p&gt;&lt;em&gt;Consider a bustling restaurant environment. The kitchen receives a flood of orders, waitstaff dart between tables, and patrons anxiously glance at their watches. Each time a waiter takes an order, he or she must verify it with the kitchen and wait for the kitchen to prepare the meal before attending to another table. This cumbersome method hampers efficiency, leaving the restaurant unable to meet customer demand.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Now envision an alternative situation. Instead of enduring delays, waitstaff enter orders into a centralized system, prompting the kitchen to begin meal preparation immediately upon receipt. As soon as the kitchen prepares the food, waiters receive instant notifications, enabling them to serve customers promptly without any delays. This exemplifies event-driven architecture: a fluid, real-time system where they exchange information asynchronously, promoting scalability and quick responsiveness.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Securing Vaadin Applications with Microsoft Entra</title><link>https://foojayio.github.io/website/today/securing-vaadin-applications-with-microsoft-entra/</link><pubDate>Wed, 26 Feb 2025 12:55:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/securing-vaadin-applications-with-microsoft-entra/</guid><description>&lt;p&gt;Many companies use Microsoft 365, so letting users log in with their Microsoft account is a good choice. This blog post shows how to secure your Vaadin applications using Microsoft Entra for authentication and authorization and explains how Karibu Testing must be configured.&lt;/p&gt;
&lt;h2 id="h2-0-step-1-create-an-application-in-entra"&gt;Step 1: Create an Application in Entra&lt;/h2&gt;
&lt;p&gt;The first step is to create an application, configure roles, assign users, and set the redirect URI.&lt;/p&gt;
&lt;p&gt;To create an application, log in to &lt;a href="http://entra.microsoft.com" target="_blank" rel="noopener noreferrer"&gt;http://entra.microsoft.com&lt;/a&gt;
 and select &amp;ldquo;Applications&amp;rdquo; -&amp;gt; &amp;ldquo;Enterprise applications.&amp;rdquo; There, you can create a new application. Select &amp;ldquo;Register an application to integrate with Microsoft Entra ID (App you&amp;rsquo;re developing).&amp;rdquo;&lt;/p&gt;</description></item><item><title>Building a declarative API with Spring AOP and SpEL</title><link>https://foojayio.github.io/website/today/building-a-declarative-api-with-spring-aop-and-spel/</link><pubDate>Wed, 12 Feb 2025 15:57:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-declarative-api-with-spring-aop-and-spel/</guid><description>&lt;p&gt;&lt;strong&gt;In this article, we&amp;rsquo;ll implement a declarative API to perform tasks belonging to cross-cutting concerns, using auditing as an example. We&amp;rsquo;ll see how SpEL and Spring AOP allow us to easily intercept invocations throughout a code base and perform arbitrary logic in an expressive and non-invasive manner.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-a-story-about-legacy"&gt;A story about legacy&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s pretend that we inherited a legacy system. The system is in a dismal state, with every change always at risk of bringing the whole thing down. One day, there is a business requirement to audit a few dozen methods scattered throughout the code base. After every invocation of these methods, we should notify an external system by sending a client id and an operation (&lt;code&gt;1234&lt;/code&gt;, &lt;code&gt;&amp;quot;CREATE_USER&amp;quot;&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Foojay Podcast #66: Let's Talk About Java Code!</title><link>https://foojayio.github.io/website/today/foojay-podcast-66/</link><pubDate>Tue, 11 Feb 2025 08:24:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-66/</guid><description>&lt;p&gt;In this Foojay podcast, we dive into a few articles that were published recently and focus on code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Igor Kulakov of JetBrains gives us his insights into the tool he created to find duplicate content in documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;Rijo Sam explains how you can generate real random values and how he created a train departure display.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;Maxillian Arruda explains in a very detailed post the different ways to construct a complex Java object.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;And we start with Wim De Troye about the code changes he had to do in a project that got upgraded from Spring Boot 2 to 3.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-0-video"&gt;Video&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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/IB7drozkKUk?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;
		&lt;/div&gt;

&lt;h2 id="h2-1-podcast-apps"&gt;Podcast Apps&lt;/h2&gt;
&lt;p&gt;You can listen and subscribe to the Foojay Podcast on:&lt;/p&gt;</description></item><item><title>Spring Data Neo4j: How to update an entity</title><link>https://foojayio.github.io/website/today/spring-data-neo4j-how-to-update-an-entity/</link><pubDate>Wed, 05 Feb 2025 18:58:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-data-neo4j-how-to-update-an-entity/</guid><description>&lt;p&gt;&lt;strong&gt;After working on a new &lt;a href="https://graphacademy.neo4j.com/courses/app-spring-data/" target="_blank" rel="noopener noreferrer"&gt;online Spring Data Neo4j course&lt;/a&gt;
, I learned a couple more things about updating an entity.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The course required a different set of scenarios than outlined in my &lt;a href="https://jmhreif.com/blog/2023/sdn-cypher-update-entity/" target="_blank" rel="noopener noreferrer"&gt;previous SDN update blog post&lt;/a&gt;
, so I wanted to cover those scenarios, as well.&lt;/p&gt;
&lt;h2 id="_spring_save_method"&gt;Spring save() method&lt;/h2&gt;
&lt;p&gt;First up is the out-of-the-box &lt;code&gt;save()&lt;/code&gt; method that is provided by Spring as a default. This method takes an input of the entity object you want to save to the database.&lt;/p&gt;</description></item><item><title>The proper way to define configuration properties in Spring</title><link>https://foojayio.github.io/website/today/the-proper-way-to-define-configuration-properties-in-spring/</link><pubDate>Tue, 07 Jan 2025 16:55:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-proper-way-to-define-configuration-properties-in-spring/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I recently did a (long overdue) &lt;strong&gt;migration from Spring Boot 2 to 3&lt;/strong&gt; on one of our larger applications.&lt;/p&gt;
&lt;p&gt;Something that surprised me was that classes marked with &lt;code&gt;@ConfigurationProperties&lt;/code&gt; had properties that were properly bound when running in Spring Boot 2 but were &lt;strong&gt;no longer&lt;/strong&gt; bound after the upgrade.&lt;/p&gt;
&lt;p&gt;Luckily, the automated testing suite caught this issue at &lt;em&gt;run time&lt;/em&gt; , but it&amp;rsquo;s obvious that such a thing silently failing can be &lt;strong&gt;quite problematic&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>AI-powered Chat Application using watsonx.ai and Spring AI</title><link>https://foojayio.github.io/website/today/ai-powered-chat-application-using-ibm-watsonx-ai-and-spring-ai/</link><pubDate>Fri, 03 Jan 2025 08:31:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/ai-powered-chat-application-using-ibm-watsonx-ai-and-spring-ai/</guid><description>&lt;p&gt;&lt;strong&gt;Generative Artificial Intelligence (Gen AI) disrupted enterprises with the introduction of GPT-4 foundation model by Open AI in the late 2022 to early 2023 triggering big tech to release their own Gen AI platform and foundation models. Among them are Google, Microsoft, AWS and IBM. In this article, we will deal with the Gen AI platform and model of IBM called watsonx and integrate it with Spring AI to create a custom chat application using the IBM Granite Foundation Model.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Speed up your Spring Batch with Native Image and GraalVM</title><link>https://foojayio.github.io/website/today/speed-up-your-spring-batch-with-native-image-and-graalvm/</link><pubDate>Tue, 10 Dec 2024 15:47:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/speed-up-your-spring-batch-with-native-image-and-graalvm/</guid><description>&lt;p&gt;&lt;strong&gt;Spring Batch is often used for&lt;/strong&gt; data processing &lt;strong&gt;jobs that don&amp;rsquo;t run continuously.&lt;/strong&gt; Instead, they start, process, and stop,&lt;strong&gt;which makes them a perfect candidate for GraalVM Native Image.&lt;/strong&gt; Unlike traditional Java applications that require a long JVM startup time, Native Images execute almost instantly, giving a significant performance boost.&lt;/p&gt;
&lt;p&gt;In this article, you&amp;rsquo;ll learn how to build a Spring Batch application that reads a CSV file, logs its content, and writes it to a PostgreSQL database.&lt;strong&gt;We&amp;rsquo;ll see how to compile it into a Native Image using GraalVM&lt;/strong&gt; , and most importantly**, we&amp;rsquo;ll benchmark the difference between** running it as &lt;strong&gt;a traditional JAR and&lt;/strong&gt; as &lt;strong&gt;a native binary&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Prevent LDAP injection in #java 💥💉with #springboot</title><link>https://foojayio.github.io/website/today/prevent-ldap-injection-in-java-with-springboot/</link><pubDate>Wed, 04 Dec 2024 14:45:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/prevent-ldap-injection-in-java-with-springboot/</guid><description>&lt;p&gt;&lt;strong&gt;LDAP (Lightweight Directory Access Protocol)&lt;/strong&gt; is essential for managing and accessing directory information in Java web applications. However, it&amp;rsquo;s crucial to understand and prevent &lt;strong&gt;LDAP Injection&lt;/strong&gt;, a serious security vulnerability that can lead to unauthorized access and data breaches.&lt;/p&gt;
&lt;p&gt;Following &lt;strong&gt;OWASP Recommendations&lt;/strong&gt; , such as validating user inputs and using parameterized queries, is vital for securing your applications. In this article, we&amp;rsquo;ll dive into LDAP, explore LDAP Injection, share OWASP&amp;rsquo;s best practices, and demonstrate secure coding in &lt;strong&gt;Spring Boot&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Task schedulers in Java: modern alternatives to Quartz Scheduler</title><link>https://foojayio.github.io/website/today/task-schedulers-in-java-modern-alternatives-to-quartz-scheduler/</link><pubDate>Thu, 28 Nov 2024 18:04:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/task-schedulers-in-java-modern-alternatives-to-quartz-scheduler/</guid><description>&lt;h3 id="h3-0-quartz-is-often-considered-the-standard-job-scheduling-library-in-java-which-can-lead-developers-to-overlook-more-modern-alternatives"&gt;Quartz is often considered the standard job scheduling library in Java, which can lead developers to overlook more modern alternatives.&lt;/h3&gt;
&lt;p&gt;For a long time, Quartz, also known as Quartz Scheduler, was the only viable open-source task scheduler in Java. In fact, the official Quartz documentation still suggests that there is &lt;a href="https://www.quartz-scheduler.org/documentation/2.3.1-SNAPSHOT/faq.html" title="no real alternative" target="_blank" rel="noopener noreferrer"&gt;no real alternative&lt;/a&gt;
. In this article, we will list a few different &lt;strong&gt;Quartz alternatives that offer a similar set of features while being easier and more enjoyable to use.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Langchain4J Musings</title><link>https://foojayio.github.io/website/today/langchain4j-musings/</link><pubDate>Sat, 23 Nov 2024 13:57:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/langchain4j-musings/</guid><description>&lt;p&gt;I&amp;rsquo;m coming relatively late to the LLM party, but I rarely come very early in the hype cycle.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://upload.wikimedia.org/wikipedia/commons/9/94/Gartner_Hype_Cycle.svg" alt="Gartner hype cycle" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;For example, I never bought into blockchain, the solution still searching for problems to solve, nor in microservices, the latest in the cargo cult IT trends. Despite my late arrival at the LLM party, I have been a regular user of LLMs. I use OpenAI for non-controversial questions outside my cone of knowledge, &lt;em&gt;e.g&lt;/em&gt;., linguistics or legal; I use GitHub Copilot in my IDE to improve my code.&lt;/p&gt;</description></item><item><title>Spring Boot: Java Template Engine (JTE)</title><link>https://foojayio.github.io/website/today/spring-boot-java-template-engine-jte/</link><pubDate>Wed, 13 Nov 2024 09:03:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-java-template-engine-jte/</guid><description>&lt;h3 id="h3-0-hello-to-all-java-and-spring-enthusiasts-i-am-the-java-template-engine-a-fresh-newcomer-to-the-spring-initializer-ecosystem"&gt;Hello to all Java and Spring enthusiasts. I am the Java Template Engine, a fresh newcomer to the Spring Initializer Ecosystem.&lt;/h3&gt;
&lt;p&gt;I have gained popularity as a template engine for developing user interface applications that use Java syntax within Spring Boot applications, alongside other engines such as Freemarker, Thymeleaf, Mustache, and Velocity. Many developers widely use Spring Boot, a framework that simplifies Java application development, and incorporating a template engine like mine streamlines the process of creating dynamic and responsive user interfaces.&lt;/p&gt;</description></item><item><title>Augmenting the client with Alpine.js</title><link>https://foojayio.github.io/website/today/augmenting-the-client-with-alpine-js/</link><pubDate>Mon, 14 Oct 2024 10:59:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/augmenting-the-client-with-alpine-js/</guid><description>&lt;p&gt;This article is part of a series comparing different ways to implement asynchronous requests on the client, which is colloquially known as AJAX. I dedicated the &lt;a href="https://foojayio.github.io/website/today/augmenting-the-client-with-vue-js/"&gt;previous post&lt;/a&gt;
 to Vue.js; I&amp;rsquo;ll dedicate this one to &lt;a href="https://alpinejs.dev/" target="_blank" rel="noopener noreferrer"&gt;Alpine.js&lt;/a&gt;
 - not to be confused with Alpine Linux.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll follow the same structure as previously.&lt;/p&gt;
&lt;h2 id="h2-0-laying-out-the-work"&gt;Laying out the work&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the setup, server- and client-side.&lt;/p&gt;
&lt;h3 id="h3-1-server-side"&gt;Server-side&lt;/h3&gt;
&lt;p&gt;Here is how I integrate Thymeleaf and Alpine.js in the POM:&lt;/p&gt;</description></item><item><title>Augmenting the client with Vue.js</title><link>https://foojayio.github.io/website/today/augmenting-the-client-with-vue-js/</link><pubDate>Mon, 14 Oct 2024 10:53:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/augmenting-the-client-with-vue-js/</guid><description>&lt;p&gt;In my &lt;a href="https://foojayio.github.io/website/today/a-short-history-of-ajax-and-ssr/"&gt;previous article&lt;/a&gt;
, I laid the ground to build upon; now is the time to start &amp;ldquo;for real&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I heard a lot of &lt;a href="https://vuejs.org/" target="_blank" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt;
. Additionally, a friend who transitioned from developer to manager told me good things about Vue, which further piqued my interest. I decided to have a look at it: it will be the first &amp;ldquo;lightweight&amp;rdquo; JavaScript framework I&amp;rsquo;ll study - from the point of view of a newbie, which I am.&lt;/p&gt;</description></item><item><title>Server-Side Rendering with Spring Boot</title><link>https://foojayio.github.io/website/today/server-side-rendering-with-spring-boot/</link><pubDate>Mon, 23 Sep 2024 06:58:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/server-side-rendering-with-spring-boot/</guid><description>&lt;p&gt;Understanding the shared steps in the project setup is crucial before delving into the specifics of each client-augmenting technology. My requirements &lt;a href="https://blog.frankel.ch/ajax-ssr/1/" target="_blank" rel="noopener noreferrer"&gt;from the last post&lt;/a&gt;
 where quite straightforward:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;ll assume the viewpoint of a backend developer&lt;/li&gt;
&lt;li&gt;No front-end build step: no TypeScript, no minification, etc.&lt;/li&gt;
&lt;li&gt;All dependencies are managed from the backend app, &lt;em&gt;i.e.&lt;/em&gt;, Maven&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s important to note that the technology I&amp;rsquo;ll be detailing, except Vaadin, follows a similar approach. Vaadin, with its unique paradigm, really stands out among the approaches.&lt;/p&gt;</description></item><item><title>Health Check Response Format for HTTP APIs</title><link>https://foojayio.github.io/website/today/health-check-response-format-for-http-apis/</link><pubDate>Thu, 12 Sep 2024 10:02:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/health-check-response-format-for-http-apis/</guid><description>&lt;p&gt;I&amp;rsquo;m continuing my journey on getting more familiar with HTTP APIs by reading related . This time, I read the &lt;a href="https://datatracker.ietf.org/doc/html/draft-inadarei-api-health-check" target="_blank" rel="noopener noreferrer"&gt;Health Check Response Format for HTTP APIs&lt;/a&gt;
 on the suggestion of &lt;a href="https://twitter.com/stefanofago/" target="_blank" rel="noopener noreferrer"&gt;Stefano Fago&lt;/a&gt;
. In this article, I&amp;rsquo;d like to summarize my reading.&lt;/p&gt;
&lt;p&gt;Note that it&amp;rsquo;s a draft. Moreover, it has been dormant for nearly two years and, thus, has been automatically expired. However, it&amp;rsquo;s the closest to a specification on health checks and thus deserves some love.&lt;/p&gt;</description></item><item><title>How to profile a performance issue using Spring Boot profiling tools</title><link>https://foojayio.github.io/website/today/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/</link><pubDate>Mon, 02 Sep 2024 09:56:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-profile-a-performance-issue-using-spring-boot-profiling-tools/</guid><description>&lt;p&gt;&lt;strong&gt;In today&amp;rsquo;s fast-paced development environment, ensuring the performance and reliability of your services is critical. Imagine you are part of a team responsible for several services essential to both internal teams and external customers. These services are the backbone of various business operations, and any downtime or performance degradation can have significant repercussions.&lt;/strong&gt;{#c79c}&lt;/p&gt;
&lt;p&gt;Now, picture this scenario: your team has not yet implemented a robust monitoring and observability system. One day, you start receiving emails and messages from frustrated clients reporting that your service is down. Panic sets in as your team tries to figure out what went wrong. Without proper monitoring tools, finding the root cause of issues in production is challenging. Persistent downtime increases pressure, affecting business operations and customer satisfaction.{#acf3}&lt;/p&gt;</description></item><item><title>OpenTelemetry Tracing on Spring Boot, Java Agent vs. Micrometer Tracing</title><link>https://foojayio.github.io/website/today/opentelemetry-tracing-on-spring-boot-java-agent-vs-micrometer-tracing/</link><pubDate>Thu, 22 Aug 2024 08:34:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/opentelemetry-tracing-on-spring-boot-java-agent-vs-micrometer-tracing/</guid><description>&lt;p&gt;&lt;strong&gt;My &lt;a href="https://github.com/nfrankel/opentelemetry-tracing" target="_blank" rel="noopener noreferrer"&gt;demo&lt;/a&gt;
 of OpenTelemetry Tracing features two Spring Boot components. One uses the Java agent, and I noticed a different behavior when I recently upgraded it from v1.x to v2.x. In the other one, I&amp;rsquo;m using Micrometer Tracing because I compile to GraalVM native, and it can&amp;rsquo;t process Java agents.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I want to compare these three different ways in this post: Java agent v1, Java agent v2, and Micrometer Tracing.&lt;/p&gt;</description></item><item><title>Spring: Internals of @ComponentScan</title><link>https://foojayio.github.io/website/today/spring-internals-of-componentscan/</link><pubDate>Tue, 20 Aug 2024 14:48:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-internals-of-componentscan/</guid><description>&lt;p&gt;&lt;strong&gt;The &lt;code&gt;@ComponentScan&lt;/code&gt; annotation, which is an interface located within the &lt;code&gt;org.springframework.context.annotation&lt;/code&gt; package, facilitates component scanning in a Spring application. This allows the Spring Container to automatically detect beans.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring automatically identifies Java classes that developers mark with stereotypes like &lt;code&gt;@Configuration, @Component, @Service, @Controller, and @Repository&lt;/code&gt;. Developers can annotate the component scan with or without parameters.&lt;/p&gt;
&lt;p&gt;You can designate either &lt;code&gt;basePackageClasses() or basePackages()&lt;/code&gt; (or its equivalent &lt;code&gt;value()&lt;/code&gt;) to identify the specific packages that need to be scanned.&lt;/p&gt;</description></item><item><title>Foojay Podcast #55: Embedded Java, Part 2</title><link>https://foojayio.github.io/website/today/foojay-podcast-55/</link><pubDate>Mon, 01 Jul 2024 08:21:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-55/</guid><description>&lt;p&gt;As a backend developer, you may not realize that Java was initially born on embedded devices like set-top boxes and gateways. We discussed this topic for the first time almost three years ago in &lt;a href="https://foojayio.github.io/website/today/foojay-podcast-2/"&gt;Foojay Podcast #2 with James Gosling, Johan Vos, Erik Costlow, and Frank Delporte&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In this episode #55, we look into the history of the Java Micro Edition and how things evolved. Nowadays, with processors becoming increasingly powerful, we can run the exact same Java runtime on any Linux system, from the biggest cloud servers to the smallest Raspberry Pi Zero.&lt;/p&gt;</description></item><item><title>How to Run Neo4j on Kubernetes</title><link>https://foojayio.github.io/website/today/how-to-run-neo4j-on-kubernetes/</link><pubDate>Tue, 25 Jun 2024 19:34:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-run-neo4j-on-kubernetes/</guid><description>&lt;h3 id="h3-0-kubernetes-is-an-open-source-container-orchestration-platform-that-automates-the-deployment-scaling-and-management-of-containerized-applications-in-this-post-we-walk-through-how-to-run-the-neo4j-graph-database-on-kubernetes"&gt;Kubernetes is an open-source container orchestration platform that automates the deployment, scaling, and management of containerized applications. In this post, we walk through how to run the Neo4j graph database on Kubernetes.&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;For an upcoming event, I was asked to give a demo of how to run Neo4j on Kubernetes. I had very little experience with Kubernetes, so I decided to document my journey for later reference.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="_what_is_kubernetes"&gt;What is Kubernetes?&lt;/h2&gt;
&lt;p&gt;Kubernetes is an open-source container orchestration platform that automates the deployment, scaling, and management of containerized applications. It was originally developed by Google and is now maintained by the Cloud Native Computing Foundation.&lt;/p&gt;</description></item><item><title>Who instruments the instrumenters?</title><link>https://foojayio.github.io/website/today/who-instruments-the-instrumenters/</link><pubDate>Thu, 30 May 2024 16:25:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/who-instruments-the-instrumenters/</guid><description>&lt;p&gt;Have you ever wondered how libraries like &lt;a href="https://spring.io/" target="_blank" rel="noopener noreferrer"&gt;Spring&lt;/a&gt;
 and &lt;a href="https://site.mockito.org/" target="_blank" rel="noopener noreferrer"&gt;Mockito&lt;/a&gt;
 modify your code at run-time to implement all their advanced features?&lt;/p&gt;
&lt;p&gt;Wouldn&amp;rsquo;t it be cool to get a peek behind the curtains?&lt;/p&gt;
&lt;p&gt;This is the premise of my &lt;a href="https://github.com/parttimenerd/meta-agent" target="_blank" rel="noopener noreferrer"&gt;meta-agent&lt;/a&gt;
, a Java agent to instrument instrumenters, to get these insights and what this blog post is about.&lt;/p&gt;
&lt;p&gt;This article is a collaboration with &lt;a href="https://www.linkedin.com/in/mika%C3%ABl-francoeur/" target="_blank" rel="noopener noreferrer"&gt;Mikaël Francoeur&lt;/a&gt;
, who had the idea for the meta-agent and wrote most of this post. So it&amp;rsquo;s my first ever post-collaboration. But I start with a short introduction to the agent itself before Mikaël takes over with real-world examples.&lt;/p&gt;</description></item><item><title>Exploring Cost-Effective Solutions for Stateful Rest Services</title><link>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</link><pubDate>Mon, 27 May 2024 13:13:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</guid><description>&lt;h2 id="h2-0-a-case-study-with-ibm-cloud-code-engine-eclipsestore-and-ibm-cloud-object-storage"&gt;A Case Study with IBM Cloud Code Engine, EclipseStore, and IBM Cloud Object Storage&lt;/h2&gt;
&lt;p&gt;In the dynamic realm of cloud computing, finding cost-effective solutions for stateful rest services that don&amp;rsquo;t necessarily require scaling can be a nuanced challenge.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll take a pragmatic look at a use case leveraging &lt;a href="https://www.ibm.com/products/code-engine" title="IBM Cloud Code Engine" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Code Engine&lt;/a&gt;
, &lt;a href="https://eclipsestore.io/" title="EclipseStore" target="_blank" rel="noopener noreferrer"&gt;EclipseStore&lt;/a&gt;
, and &lt;a href="https://www.ibm.com/products/cloud-object-storage" title="IBM Cloud Object Storage (COS)" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Object Storage (COS)&lt;/a&gt;
. The goal is to shed light on how this can be a practical and economical alternative, particularly when scalability is not a primary concern.&lt;/p&gt;</description></item><item><title>Task scheduler in Java: background job processing with JobRunr</title><link>https://foojayio.github.io/website/today/getting-started-with-jobrunr-a-powerful-task-scheduler-in-ja/</link><pubDate>Wed, 22 May 2024 11:05:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-jobrunr-a-powerful-task-scheduler-in-ja/</guid><description>&lt;h2 id="h2-0-what-is-jobrunr"&gt;What is JobRunr&lt;/h2&gt;
&lt;h3 id="h3-1-task-scheduler-in-java"&gt;Task scheduler in Java&lt;/h3&gt;
&lt;p&gt;JobRunr is an open-source Java library for &lt;strong&gt;task scheduling&lt;/strong&gt; and &lt;strong&gt;distributed background job&lt;/strong&gt; processing. It offers an effortless way to &lt;strong&gt;perform background tasks using only Java 8 lambdas&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Whether it is a &lt;strong&gt;fire-and-forget&lt;/strong&gt; , &lt;strong&gt;scheduled&lt;/strong&gt; or &lt;strong&gt;recurring job&lt;/strong&gt; , JobRunr analyzes the lambda and stores the metadata needed to process the job in a database. This simple architecture, with a few other mechanisms, allows a job to be &lt;strong&gt;executed on any available server&lt;/strong&gt; running your application (👋 k8s).&lt;/p&gt;</description></item><item><title>Spring AI: How to Write GenAI Applications with Java</title><link>https://foojayio.github.io/website/today/spring-ai-how-to-write-genai-applications-with-java/</link><pubDate>Thu, 09 May 2024 18:46:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-ai-how-to-write-genai-applications-with-java/</guid><description>&lt;p&gt;Generative AI (GenAI) is currently a hot topic in the tech world. It&amp;rsquo;s a subset of artificial intelligence that focuses on creating new content, such as text, images, or music. One popular type of GenAI component is the Large Language Model (LLM), which can generate human-like text based on a prompt.&lt;/p&gt;
&lt;p&gt;Retrieval-Augmented Generation (RAG) is a technique that enhances the accuracy and reliability of generative AI models by grounding them in external knowledge sources. While most GenAI applications and related content are centered around Python and its ecosystem, what if you want to write a GenAI application in Java?&lt;/p&gt;</description></item><item><title>Spring Framework – Internals of RestClient</title><link>https://foojayio.github.io/website/today/spring-internals-of-restclient/</link><pubDate>Mon, 25 Mar 2024 11:32:54 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-internals-of-restclient/</guid><description>&lt;p&gt;&lt;strong&gt;As a developer and architect, my constant pursuit is to achieve simplicity and elegance when constructing resilient and intricate enterprise applications. With my affinity for the Spring Framework, I have witnessed firsthand the simplicity and modernization it brings to the Spring Ecosystem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This framework enables the creation of complex enterprise applications in a more streamlined and refined manner, boasting a sophisticated diffusion and transformer architecture.&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-103465" src="RestClient_1-700x394.jpg" alt="Spring RestClient" width="700" height="394"&gt;
&lt;p&gt;Spring RestClient&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&lt;a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.2-Release-Notes#restclient-support" title="Spring Boot 3.2" target="_blank" rel="noopener noreferrer"&gt;Spring Boot 3.2&lt;/a&gt;
 launched and introduced a range of captivating functionalities. Notably, the release includes the RestClient feature, which offers a contemporary approach to developing REST endpoints.&lt;/p&gt;</description></item><item><title>Localize applications with AI</title><link>https://foojayio.github.io/website/today/localize-apps-with-ai/</link><pubDate>Wed, 20 Mar 2024 08:50:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/localize-apps-with-ai/</guid><description>&lt;p&gt;Read in other languages: &lt;a href="https://flounder.dev/zh/posts/localize-apps-with-ai/" target="_blank" rel="noopener noreferrer"&gt;中文&lt;/a&gt;
 &lt;a href="https://flounder.dev/es/posts/localize-apps-with-ai/" target="_blank" rel="noopener noreferrer"&gt;Español&lt;/a&gt;
 &lt;a href="https://flounder.dev/pt/posts/localize-apps-with-ai/" target="_blank" rel="noopener noreferrer"&gt;Português&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ever wondered if AI can localize an entire project? In this article, we follow the process end-to-end using the Spring Petclinic as an example. We prepare the project for localization, automate the translation using Python and DeepL, and analyze the results&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Whether you are thinking of localizing your project or just learning how to do that, AI might help you. It offers a cost-efficient entry point for experiments and automations.&lt;/p&gt;</description></item><item><title>Video: Spring Boot Testcontainers Support for Local Development</title><link>https://foojayio.github.io/website/today/video-spring-boot-testcontainers-support-for-local-development/</link><pubDate>Fri, 16 Feb 2024 09:07:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/video-spring-boot-testcontainers-support-for-local-development/</guid><description>&lt;p&gt;Spring Boot has supported TestsContainers for running services during tests for quite a while.&lt;/p&gt;
&lt;p&gt;With Spring Boot 3.1, Testcontainers support for local development was added. This video will show you how this works and how to use it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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/GoBm7BoufIM?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;
		&lt;/div&gt;</description></item><item><title>Minimize costs utilizing the cloud with Spring-Data-Eclipse-Store</title><link>https://foojayio.github.io/website/today/minimize-costs-by-utilizing-cloud-storage-with-spring-data-eclipse-store/</link><pubDate>Tue, 13 Feb 2024 15:26:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/minimize-costs-by-utilizing-cloud-storage-with-spring-data-eclipse-store/</guid><description>&lt;p&gt;Sooner or later any Spring application needs to store data. And of course, the first and easiest move is to utilize &lt;a href="https://spring.io/projects/spring-data-jpa" target="_blank" rel="noopener noreferrer"&gt;Spring Data JPA&lt;/a&gt;
. You can set up your data storage without knowing which relational database you will use in production and simply start coding without worrying about that.&lt;/p&gt;
&lt;p&gt;It is the easiest and most convenient way to store data (in a relational database like PostgreSQL), yet in the cloud environment it is also an expensive way. Pricing at AWS RDS starts at 30$/month with tiny-Instances and always have &lt;strong&gt;fixed monthly costs regardless of its usage&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Migrate to Spring Boot 3.2 with OpenRewrite</title><link>https://foojayio.github.io/website/today/openrewrite-migrate-to-spring-boot-3-2/</link><pubDate>Tue, 06 Feb 2024 08:17:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/openrewrite-migrate-to-spring-boot-3-2/</guid><description>&lt;p&gt;&lt;strong&gt;As a developer, we frequently face the challenges of migrating to newer versions of frameworks and refactoring code. However, we can effortlessly achieve these tasks with the assistance of &lt;a href="https://docs.openrewrite.org/" target="_blank" rel="noopener noreferrer"&gt;OpenRewrite&lt;/a&gt;
. OpenRewrite provides a stack of recipes specifically designed for migration purposes. By utilizing the appropriate recipes and integrating with the rewrite plugin, we can effectively migrate our code.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Two months ago, the Spring Boot 3.2 version released, bringing numerous changes to the framework. If you are involved in multiple projects and require migrating to the latest version, developers may find manually updating all the code repositories with the necessary upgrade changes a challenging task.&lt;/p&gt;</description></item><item><title>Video: Spring Boot Docker Compose Support</title><link>https://foojayio.github.io/website/today/video-spring-boot-docker-compose-support/</link><pubDate>Wed, 31 Jan 2024 07:50:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/video-spring-boot-docker-compose-support/</guid><description>&lt;p&gt;In Spring Boot 3.1, Docker Compose support was added to simplify local development with external resources.&lt;/p&gt;
&lt;p&gt;In this video, I show you how this works and how to use it!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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/BQkvCxmaiqU?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;
		&lt;/div&gt;

&lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Building gdocweb with Java 21, Spring Boot 3.x and Beyond</title><link>https://foojayio.github.io/website/today/building-gdocweb-with-java-21-spring-boot-3-x-and-beyond/</link><pubDate>Tue, 30 Jan 2024 12:40:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-gdocweb-with-java-21-spring-boot-3-x-and-beyond/</guid><description>&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#introducing-gdocweb"&gt;Introducing gdocweb&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#java-21-and-spring-boot-3x-innovation-and-maturity"&gt;Java 21 and Spring Boot 3.x: Innovation and Maturity&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#graalvm-native-image-for-efficiency"&gt;GraalVM Native Image for Efficiency&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#implementing-graalvm"&gt;Implementing GraalVM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#facing-the-production-challenges"&gt;Facing the Production Challenges&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-decision-to-move-on"&gt;The Decision to Move On&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#deployment-vps-and-docker-compose"&gt;Deployment: VPS and Docker Compose&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#avoiding-raw-vps-deployment"&gt;Avoiding Raw VPS Deployment&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#steering-clear-of-managed-containers-orchestration"&gt;Steering Clear of Managed Containers &amp;amp; Orchestration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-choice-of-docker-compose"&gt;The Choice of Docker Compose&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#front-end-thymeleaf-over-modern-alternatives"&gt;Front-End: Thymeleaf Over Modern Alternatives&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#react-modern-but-not-a-one-size-fits-all-solution"&gt;React: Modern but Not a One-Size-Fits-All Solution&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-appeal-of-thymeleaf"&gt;The Appeal of Thymeleaf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#considering-htmx-for-dynamic-functionality"&gt;Considering HTMX for Dynamic Functionality&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-word"&gt;Final Word&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Starting a new project is always a mix of excitement and tough decisions, especially when you&amp;rsquo;re stitching together familiar tools like Google Docs with powerhouses like GitHub Pages.&lt;/p&gt;</description></item><item><title>Durable Subscription with JMS and Spring Boot</title><link>https://foojayio.github.io/website/today/durable-subscription-with-jms-and-spring-boot/</link><pubDate>Thu, 28 Dec 2023 12:45:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/durable-subscription-with-jms-and-spring-boot/</guid><description>&lt;p&gt;&lt;strong&gt;When using the publish-subscribe domain with JMS, we often want to use durable subscriptions. But how can this be done with Spring Boot?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-what-is-jms"&gt;What is JMS?&lt;/h2&gt;
&lt;p&gt;The Java Message Service (JMS) API is a standard for creating, sending, receiving, and reading messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.&lt;/p&gt;
&lt;p&gt;JMS supports two message delivery modes: Point-to-Point and Publish/Subscribe&lt;/p&gt;
&lt;p&gt;In the point-to-point domain, a producer can send a message to one consumer through a destination called &amp;ldquo;queue&amp;rdquo;. A given queue may have multiple receivers, but only one receiver may consume each message.
&lt;img src="https://foojayio.github.io/website/today/durable-subscription-with-jms-and-spring-boot/image.png" alt="" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Book Review: Modern Frontends with htmx</title><link>https://foojayio.github.io/website/today/book-review-modern-frontends-with-htmx/</link><pubDate>Sun, 24 Dec 2023 10:07:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-modern-frontends-with-htmx/</guid><description>&lt;p&gt;&lt;strong&gt;People who follow me probably know I have a big love for user interface development with JavaFX (for desktop), and Vaadin (for browser). But as always, there are different solutions for every challenge, and building a web user interface with Java can be done with other frameworks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;htmx seems to be one of those hot new rising stars, and I already wanted to dive deeper into it, but didn&amp;rsquo;t find the time yet.&lt;/p&gt;</description></item><item><title>Handling security vulnerabilities in Spring Boot</title><link>https://foojayio.github.io/website/today/handling-security-vulnerabilities-in-spring-boot/</link><pubDate>Fri, 22 Dec 2023 14:59:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/handling-security-vulnerabilities-in-spring-boot/</guid><description>&lt;p&gt;&lt;strong&gt;In the world of software development, managing dependencies is a core part of creating strong and secure applications. Spring Boot, a favorite among Java developers, makes building applications easier, but there&amp;rsquo;s more to it than meets the eye. Keeping your dependencies in check is crucial to ensure that your Spring Boot projects run smoothly and remain resilient in the face of ever-evolving threats.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One critical aspect of Spring Boot dependency management is security. Software vulnerabilities are discovered frequently, and by keeping your project&amp;rsquo;s dependencies up to date, you&amp;rsquo;re essentially putting on your digital security armor. Outdated dependencies can be like unlocked doors, inviting trouble from potential threats, and that&amp;rsquo;s something we&amp;rsquo;d like to avoid.&lt;/p&gt;</description></item><item><title>Testing Spring Boot JMS with ActiveMQ Artemis and Testcontainers</title><link>https://foojayio.github.io/website/today/testing-spring-boot-jms-with-activemq-artemis-and-testcontainers/</link><pubDate>Tue, 12 Dec 2023 07:55:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/testing-spring-boot-jms-with-activemq-artemis-and-testcontainers/</guid><description>&lt;p&gt;&lt;strong&gt;Currently, I&amp;rsquo;m teaching JMS with Spring Boot at the University of Applied Science in Bern, Switzerland. We use &lt;a href="https://activemq.apache.org/components/artemis/" target="_blank" rel="noopener noreferrer"&gt;Apache ActiveMQ Artemis&lt;/a&gt;
 as the JMS message broker. But how can we test our Spring Boot application?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-testcontainers-to-the-rescue"&gt;Testcontainers to the Rescue&lt;/h2&gt;
&lt;p&gt;Currently, there is no &lt;a href="https://java.testcontainers.org%24/" target="_blank" rel="noopener noreferrer"&gt;Testcontainers Java&lt;/a&gt;
 module for ActiveMQ Artemis. As you can see in the &lt;a href="https://github.com/testcontainers/testcontainers-java" target="_blank" rel="noopener noreferrer"&gt;Testcontainers GitHub repository&lt;/a&gt;
, there is an active activemq branch that may be released soon. But in the meantime, we need another solution.&lt;/p&gt;</description></item><item><title>Couch to fully-observed code with Spring Boot 3.2, Micrometer Tracing, and Digma</title><link>https://foojayio.github.io/website/today/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/</link><pubDate>Wed, 06 Dec 2023 10:42:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/couch-to-fully-observed-code-with-spring-boot-3-2-micrometer-tracing-and-digma/</guid><description>&lt;p&gt;&lt;strong&gt;Collecting important data about your code in dev and test has become trivial, it&amp;rsquo;s now also getting easier to put that data to use.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;{#more-103351}&lt;/p&gt;
&lt;h2 id="h2-0-tracing-debugging"&gt;Tracing &amp;gt; Debugging&lt;/h2&gt;
&lt;p&gt;There are many benefits to being able to follow what your Spring Boot code is doing using tracing. When used effectively, traces can reveal a lot about the inner workings of complex systems, or provide early feedback when you make mistakes in introducing new code changes.&lt;/p&gt;</description></item><item><title>SpringBoot 3.2 + CRaC</title><link>https://foojayio.github.io/website/today/springboot-3-2-crac/</link><pubDate>Tue, 28 Nov 2023 13:04:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/springboot-3-2-crac/</guid><description>&lt;p&gt;Last week Spring 6.1 and &lt;a href="https://spring.io/blog/2023/11/23/spring-boot-3-2-0-available-now" title="SpringBoot 3.2" target="_blank" rel="noopener noreferrer"&gt;SpringBoot 3.2&lt;/a&gt;
 were released and they both came with full support for CRaC (Coordinated Restore at Checkpoint).&lt;/p&gt;
&lt;p&gt;If you want to learn more about CRaC, feel free to read about it &lt;a href="https://docs.azul.com/core/crac/crac-introduction" title="here" target="_blank" rel="noopener noreferrer"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CRaC is an &lt;a href="https://wiki.openjdk.org/display/crac" title="OpenJDK project" target="_blank" rel="noopener noreferrer"&gt;OpenJDK project&lt;/a&gt;
 that can &amp;ldquo;snapshot&amp;rdquo; a running JVM (Java Virtual Machine) and store its state, including your application, to disk. Then, at another point in time, you can restore the JVM from the saved checkpoint back to memory. With this, one can start an application, warm it up, and create a checkpoint. Restoring from the saved checkpoint back to memory mainly relies on disk I/O, which means it is really fast (in the range of milliseconds).&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Patterns For The Design Of Microservices – Part 3</title><link>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-3/</link><pubDate>Thu, 16 Nov 2023 04:35:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-3/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/" title="part1"&gt;part1&lt;/a&gt;
, &lt;a href="https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/" title="part2"&gt;part2&lt;/a&gt;
, we discussed several design patterns that aid in the development of microservices.&lt;/p&gt;
&lt;p&gt;This blog post will cover the subsequent design patterns.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Observability Patterns&lt;/li&gt;
&lt;li&gt;Cross-cutting Concern Patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-103034" src="MSPatternsOne-700x394.png" alt="Microservice Architecture" width="700" height="394"&gt;
&lt;p&gt;Microservice Architecture Patterns&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Undoubtedly, the logging mechanism benefits troubleshooting issues that arise when executing operations or transactions on multiple deployed microservices.&lt;/p&gt;
&lt;p&gt;We can further categorize the observability patterns into six distinct patterns.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log Aggregation&lt;/li&gt;
&lt;li&gt;Application Metrics&lt;/li&gt;
&lt;li&gt;Audit Logging&lt;/li&gt;
&lt;li&gt;Distrubuted Tracing&lt;/li&gt;
&lt;li&gt;Exception Tracking&lt;/li&gt;
&lt;li&gt;Health Check API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the subsequent segment, we will discuss each topic separately.&lt;/p&gt;</description></item><item><title>Patterns For The Design Of Microservices – Part 2</title><link>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/</link><pubDate>Mon, 30 Oct 2023 08:58:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/" title="previous article"&gt;previous article&lt;/a&gt;
, we discussed some of the design patterns employed in the creation of microservices. In this subsequent article, we will delve into the remaining patterns that are commonly utilized in the realm of microservices.&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-102866" src="MSPatterns-700x394.png" alt="Microservice Architecture" width="700" height="394"&gt;
&lt;p&gt;Database Patterns&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;There are seven distinct patterns that further categorize the data management.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Database per Service&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared Database&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saga Pattern&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command-Query Responsiblity Segregation (CQRS)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Composition&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain Event&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event Sourcing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the next section, let&amp;rsquo;s discuss each pattern individually.&lt;/p&gt;</description></item><item><title>Patterns For The Design of Microservices</title><link>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/</link><pubDate>Wed, 11 Oct 2023 06:11:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/</guid><description>&lt;p&gt;Design patterns plays a pivotal role in designing and solving the commonly occurring problems in software application. It is guiding principle or template to the solve any designing problems.&lt;/p&gt;
&lt;p&gt;It applies to the Microservices architectural style as well. These patterns provide a structured approach to designing and implementing Microservice architectures, ensuring &lt;strong&gt;scalability&lt;/strong&gt; , &lt;strong&gt;maintainability&lt;/strong&gt; , and &lt;strong&gt;reusability&lt;/strong&gt;. By adhering to these design patterns, developers can proficiently tackle the common challenges encountered during Microservices development.&lt;/p&gt;</description></item><item><title>Spring Boot and React in Harmony</title><link>https://foojayio.github.io/website/today/spring-boot-and-react-in-harmony/</link><pubDate>Tue, 03 Oct 2023 09:14:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-and-react-in-harmony/</guid><description>&lt;h3 id="h3-0-develop-clean-and-maintainable-business-apps-on-top-of-spring-boot-and-react-and-do-it-faster-using-the-hilla-framework"&gt;Develop clean and maintainable business apps on top of Spring Boot and React, and do it faster using the Hilla framework.&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;For many full-stack developers, the combination of Spring Boot and React has become a staple in building dynamic business applications. Yet, while powerful, this pairing has its set of challenges. From type-related errors to collaboration hurdles, developers often find themselves navigating a maze of everyday issues.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://hilla.dev/" title="Hilla" target="_blank" rel="noopener noreferrer"&gt;Hilla&lt;/a&gt;
, a framework that aims to simplify this landscape. If Hilla hasn&amp;rsquo;t crossed your radar yet, this article will provide an overview of what it offers and how it can potentially streamline your development process when working with Spring Boot and React.&lt;/p&gt;</description></item><item><title>Book Review: Get Your Hands Dirty on Clean Architecture</title><link>https://foojayio.github.io/website/today/book-review-get-your-hands-dirty-on-clean-architecture/</link><pubDate>Sat, 23 Sep 2023 12:00:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-get-your-hands-dirty-on-clean-architecture/</guid><description>&lt;p&gt;&lt;strong&gt;I recently completed reading &amp;ldquo;Get Your Hands Dirty on Clean Architecture&amp;rdquo; authored by Tom Hombergs and I deem it an indispensable resource for developers aspiring to produce clean code and implement the Hexagonal Architecture. Consequently, I have resolved to compose a review to aid numerous individuals who harbor a fervent interest in technology!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; Get Your Hands Dirty on Clean Architecture&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; Tom Hombergs&lt;br&gt;
&lt;strong&gt;Genre:&lt;/strong&gt; Technical, Software Architecture&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/book-review-get-your-hands-dirty-on-clean-architecture/GetYourHandsDirtyOnCleanArchitecture.jpg" alt="CleanArchitecture" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;In the constantly changing realm of software development, architectural principles hold a crucial position in determining the triumph and sustainability of a project. The book authored by Tom Hombergs, titled &amp;ldquo;Get Your Hands Dirty on Clean Architecture: A hands-on guide to creating clean web applications with code examples in Java,&amp;rdquo; is an exceptional guide that illuminates the importance of clean architecture, while also offering practical perspectives on its implementation through the Java programming language.&lt;/p&gt;</description></item><item><title>System Architecture: Move Authentication to the API Gateway</title><link>https://foojayio.github.io/website/today/system-architecture-move-authentication-to-the-api-gateway/</link><pubDate>Fri, 15 Sep 2023 07:47:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/system-architecture-move-authentication-to-the-api-gateway/</guid><description>&lt;p&gt;&lt;strong&gt;When exposing an application to the outside world, consider a Reverse-Proxy or an API Gateway to protect it from attacks. Rate Limiting comes to mind first, but it shouldn&amp;rsquo;t stop there. We can factor many features in the API Gateway and should be bold in moving them from our apps. In this post, I&amp;rsquo;ll show how to implement authentication at the Gateway API stage.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-overall-authentication-flow"&gt;Overall authentication flow&lt;/h2&gt;
&lt;p&gt;The API Gateway doesn&amp;rsquo;t authenticate but delegates authentication to an authentication provider. After authentication, the Gateway forwards the request to the app. The app checks authentication and gets the associated identity and permissions.&lt;/p&gt;</description></item><item><title>Spring's new JdbcClient API for performing database operations</title><link>https://foojayio.github.io/website/today/the-new-jdbcclient-introduced-in-spring-framework-6-1/</link><pubDate>Fri, 08 Sep 2023 06:45:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-new-jdbcclient-introduced-in-spring-framework-6-1/</guid><description>&lt;p&gt;&lt;strong&gt;Spring framework 6.1 introduced a new JdbcClient API, which is a wrapper on top of JdbcTemplate, for performing database operations using a fluent API.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring Boot 3.2 is going to include Spring framework 6.1, so let&amp;rsquo;s take a quick look at&lt;/p&gt;
&lt;p&gt;how we can use &lt;strong&gt;JdbcClient&lt;/strong&gt; to implement various database operations in a simplified manner.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s go to &lt;a href="https://start.spring.io/" target="_blank" rel="noopener noreferrer"&gt;https://start.spring.io/&lt;/a&gt;
 and create a Spring Boot application by selecting&lt;br&gt;
&lt;strong&gt;Spring JDBC&lt;/strong&gt; , &lt;strong&gt;PostgreSQL Driver&lt;/strong&gt; , &lt;strong&gt;Flyway Migration&lt;/strong&gt; , and &lt;strong&gt;Testcontainers&lt;/strong&gt; starters.&lt;/p&gt;</description></item><item><title>Spring 6.1 - RestClient</title><link>https://foojayio.github.io/website/today/spring-6-1-restclient/</link><pubDate>Wed, 30 Aug 2023 16:23:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-6-1-restclient/</guid><description>&lt;p&gt;As you might have read in this &lt;a href="https://spring.io/blog/2023/07/13/new-in-spring-6-1-restclient" target="_blank" rel="noopener noreferrer"&gt;blogpost&lt;/a&gt;
, Spring is introducing a &lt;code&gt;RestClient&lt;/code&gt; in Spring 6.1 to interact with HTTP backends.&lt;/p&gt;
&lt;p&gt;Now some of you might be wondering as to the why, given we already have a plethora of other options such as &lt;code&gt;RestTemplate&lt;/code&gt;, &lt;code&gt;WebClient&lt;/code&gt;, &lt;code&gt;HttpUrlConnection&lt;/code&gt;, &amp;hellip;​&lt;/p&gt;
&lt;p&gt;As we can see on the &lt;a href="https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html" target="_blank" rel="noopener noreferrer"&gt;javadoc&lt;/a&gt;
 page &lt;code&gt;RestTemplate&lt;/code&gt; got quite massive over time.&lt;/p&gt;
&lt;p&gt;The Spring team drew lessons from this, and the reactive &lt;code&gt;WebClient&lt;/code&gt; was created with a fluent interface.&lt;/p&gt;</description></item><item><title>Spring Boot Configuration for Docker Images with Azul Zulu</title><link>https://foojayio.github.io/website/today/configuring-spring-boot-to-build-a-docker-image-with-azul-zulu-and-debug-options/</link><pubDate>Wed, 30 Aug 2023 16:14:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/configuring-spring-boot-to-build-a-docker-image-with-azul-zulu-and-debug-options/</guid><description>&lt;p&gt;&lt;em&gt;The Spring Boot Maven Plugin makes creating a Docker image from your application very easy! In this article, we give you some extra tips and examples for configuring Spring Boot to define the Java runtime used in such a Spring Boot Docker image and explain how to add additional environmental options to ease debugging.&lt;/em&gt;
&lt;img src="https://foojayio.github.io/website/today/configuring-spring-boot-to-build-a-docker-image-with-azul-zulu-and-debug-options/azul-zulu-springboot-docker-1024x400.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id="h3-0-for-this-post-i-got-the-help-of-dashaun-carter-spring-developer-advocate-who-immediately-jumped-in-when-i-raised-some-questions-about-these-configuration-options-thanks-dashaun"&gt;For this post, I got the help of &lt;a href="https://twitter.com/dashaun" target="_blank" rel="noopener noreferrer"&gt;DaShaun Carter&lt;/a&gt;
, Spring Developer Advocate, who immediately jumped in when I raised some questions about these configuration options. Thanks, DaShaun!&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;h2 id="h-spring-boot-petclinic-project"&gt;Spring Boot Petclinic Project&lt;/h2&gt;
&lt;p&gt;To illustrate our approach, we&amp;rsquo;ll use the Spring Boot Petclinic project, a Spring Boot application built using Maven or Gradle, to demonstrate how a Spring Boot project is set up fully and how the code is structured and must be packaged.&lt;/p&gt;</description></item><item><title>Create a Spring Boot Application to Retrieve Data from Evernote</title><link>https://foojayio.github.io/website/today/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/</link><pubDate>Mon, 28 Aug 2023 11:06:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-create-a-spring-boot-application-to-retrieve-data-from-evernote/</guid><description>&lt;p&gt;I recently started work on a joint project with my colleague, &lt;a href="https://twitter.com/jalakoo" target="_blank" rel="noopener noreferrer"&gt;Jason Koo&lt;/a&gt;
. For this project, we want to import data from second brain apps (such as Obsidian, Notion, Evernote, etc) to Neo4j.&lt;/p&gt;
&lt;p&gt;Since I use Evernote, I was tasked with getting my notes out of Evernote.&lt;/p&gt;
&lt;p&gt;In this article, I will show you how to use the Evernote API and SDK in a Spring Boot application to retrieve data from Evernote.&lt;/p&gt;</description></item><item><title>Spring Boot: local development enhancements, let's compose!</title><link>https://foojayio.github.io/website/today/spring-boot-local-development-enhancements-lets-compose/</link><pubDate>Fri, 25 Aug 2023 11:16:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-local-development-enhancements-lets-compose/</guid><description>&lt;p&gt;Quite often when we are developing an application we need external services such as rabbitMQ, Kafka, etc.&lt;/p&gt;
&lt;p&gt;When you are developing locally, you are quite likely using a docker-compose file to start these up, and I am certainly (hopefully) not the only one that has forgotten at least once to start these instances up.&lt;/p&gt;
&lt;p&gt;And maybe you are even already using Testcontainers for your testing.&lt;/p&gt;
&lt;p&gt;Luckily, Spring Boot 3.1 introduced some nice improvements to make our lives a bit easier.&lt;/p&gt;</description></item><item><title>Exploring File Storage Solutions in Spring Boot</title><link>https://foojayio.github.io/website/today/exploring-file-storage-solutions-in-spring-boot-database-local-systems-cloud-services-and-beyond/</link><pubDate>Wed, 23 Aug 2023 08:07:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-file-storage-solutions-in-spring-boot-database-local-systems-cloud-services-and-beyond/</guid><description>&lt;p&gt;&lt;strong&gt;When building a web application, managing file uploads properly is a common requirement. After receiving, files can be stored in several places: in a file system, in a database or, more commonly, in a cloud storage service.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this article, we will cover how to store files in a database using Spring Boot and discuss some alternatives.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="h2-0-introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Recently, a fellow developer who I helped in past reached out to me on Slack seeking assistance with handling file uploads in a Spring Boot application. After providing some guidance, I decided to compile this article to assist others facing similar challenges.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 10: Service Discovery with Eureka</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-10-service-discovery-with-eureka/</link><pubDate>Thu, 13 Jul 2023 06:39:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-10-service-discovery-with-eureka/</guid><description>&lt;p&gt;Gaining complexity in a microservices system certainly isn&amp;rsquo;t for the faint of heart (though neither is complexity in monoliths!).&lt;/p&gt;
&lt;p&gt;When there are many services that need to communicate with one another, we might need to coordinate multiple services communicating with multiple other services.&lt;/p&gt;
&lt;p&gt;We also might code for varying environments such as local, development server, or the cloud.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do services know where to find one another?&lt;/li&gt;
&lt;li&gt;How can we avoid problems when a service is unavailable?&lt;/li&gt;
&lt;li&gt;How do we handle requests when we scale up or down certain parts of our system?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where something like Spring Cloud Netflix Eureka comes into play.&lt;/p&gt;</description></item><item><title>Sticky sessions with Apache APISIX - the demo</title><link>https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix-the-demo/</link><pubDate>Fri, 07 Jul 2023 16:54:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix-the-demo/</guid><description>&lt;p&gt;We&amp;rsquo;ve described the concept behind &lt;a href="https://foojayio.github.io/website/today/sticky-sessions-with-apache-apisix/"&gt;sticky sessions&lt;/a&gt;
: you forward a request to the same upstream because there&amp;rsquo;s context data associated with the session on that node.&lt;/p&gt;
&lt;p&gt;However, if necessary, you should replicate the data to other upstreams because this one might go down. In this post, we are going to illustrate it with a demo.&lt;/p&gt;
&lt;h2 id="h2-0-the-overall-design"&gt;The overall design&lt;/h2&gt;
&lt;p&gt;Design options are limitless. I&amp;rsquo;ll keep myself to a familiar stack, the JVM. Also, as mentioned in the previous post, one should only implement sticky sessions with session replication.&lt;/p&gt;</description></item><item><title>Spring Boot Debugging with Aspect-Oriented Programming (AOP)</title><link>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</link><pubDate>Fri, 05 May 2023 08:19:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-debugging-with-aspect-oriented-programming-aop/</guid><description>&lt;p&gt;Aspect-Oriented Programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.&lt;/p&gt;
&lt;p&gt;In simple terms, it helps you keep your code clean, modular, and easy to maintain.&lt;/p&gt;
&lt;p&gt;We can leverage AOP to debug Spring Boot applications more effectively and seamlessly.&lt;/p&gt;
&lt;p&gt;In this post, we will explore how to use AOP to debug a Spring Boot application effectively.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&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/6kxpkcEqssw?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;
		&lt;/div&gt;

&lt;br /&gt;
&lt;h2 id="h2-0-aop-concepts"&gt;AOP Concepts&lt;/h2&gt;
&lt;p&gt;Before diving into debugging with AOP, it is essential to understand the core concepts. AOP lets us write code that executes before or after a method. It includes the following common terms:&lt;/p&gt;</description></item><item><title>Developer vs. ChatGPT Part I: Writing a Spring Boot Microservice</title><link>https://foojayio.github.io/website/today/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/</link><pubDate>Thu, 27 Apr 2023 15:25:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-developer-vs-chatgpt-part-i-writing-a-spring-boot-microservice/</guid><description>&lt;h3 id="h3-0-we-pit-a-seasoned-java-developer-against-the-all-knowing-generative-ai-to-find-out-once-and-for-all-can-an-ai-generate-a-java-microservice-end-to-end"&gt;We pit a seasoned Java developer against the all-knowing generative AI to find out once and for all: Can an AI generate a Java microservice end-to-end?&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s a lot of buzz around Generative AI tools for code generation. It&amp;rsquo;s no secret that the future of developer productivity goes alongside tools such as &lt;a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;
 and &lt;a href="https://openai.com/blog/chatgpt" target="_blank" rel="noopener noreferrer"&gt;OpenAI&amp;rsquo;s ChatGPT&lt;/a&gt;
 to enable us, developers, to produce code better and faster. These tools can learn from our existing code and suggest new code based on the desired functionality, most importantly, they can even write documentation and tests!&lt;/p&gt;</description></item><item><title>Control your Arduino with Spring</title><link>https://foojayio.github.io/website/today/control-your-arduino-with-spring/</link><pubDate>Sat, 25 Mar 2023 07:21:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/control-your-arduino-with-spring/</guid><description>&lt;p&gt;Have you ever wanted to control your Arduino board from a Raspberry Pi, or your computer, using only Java and not the Arduino language?&lt;/p&gt;
&lt;p&gt;In this article, I show how I created a web app to control my Arduino with a Raspberry PI using Spring. And so this is another article about Java on Raspberry PI or perhaps this time I can say Java and Arduino.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/control-your-arduino-with-spring/Arduino_spring01.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="h3-0-idea"&gt;Idea&lt;/h3&gt;
&lt;p&gt;A simple Spring app where I can create a REST interface to control one of the Arduino GPIOs. I can plug a LED and build a simple blink LED example.&lt;/p&gt;</description></item><item><title>Is it Time to go Back to the Monolith?</title><link>https://foojayio.github.io/website/today/is-it-time-to-go-back-to-the-monolith/</link><pubDate>Fri, 03 Mar 2023 15:58:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/is-it-time-to-go-back-to-the-monolith/</guid><description>&lt;p&gt;History repeats itself. Everything old is new again and I&amp;rsquo;ve been around long enough to see ideas discarded, rediscovered and return triumphantly to overtake the fad.&lt;/p&gt;
&lt;p&gt;In recent years SQL has made a tremendous comeback from the dead. We love relational databases all over again. I think the Monolith will have its space odyssey moment again. Microservices and serverless are trends pushed by the cloud vendors, designed to sell us more cloud computing resources.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 9: Docker compose all the things</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</link><pubDate>Sun, 26 Feb 2023 10:02:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</guid><description>&lt;p&gt;Our microservices project contains quite a few pieces now.&lt;/p&gt;
&lt;p&gt;We have two databases, three API services, a user-view service for books, and a service to host our configuration.&lt;/p&gt;
&lt;p&gt;With so many pieces to manage, it would be nice to have something that orchestrates the individual services into a system, such as Docker Compose.&lt;/p&gt;
&lt;p&gt;Back in our &lt;a href="https://foojayio.github.io/website/today/journeys-in-java-level-5-building-an-empire-of-microservices/"&gt;Level 5&lt;/a&gt;
 rendition, we did exactly this for our smaller version of the project.&lt;/p&gt;
&lt;p&gt;Now that we have expanded our services, we need to add those new pieces into the existing Docker Compose management umbrella.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 8: Add MongoDB to Spring Cloud Config</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-8-add-mongodb-to-spring-cloud-config/</link><pubDate>Thu, 09 Feb 2023 16:56:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-8-add-mongodb-to-spring-cloud-config/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/"&gt;our last article&lt;/a&gt;
, we used Spring Cloud Config to provide database credentials to a microservice application connecting to a cloud-hosted Neo4j database. This post will backport this concept to our existing MongoDB database instance and its related microservices.&lt;/p&gt;
&lt;p&gt;We will add our MongoDB credentials to the config server, so that it will be the central place for both our Neo4j and MongoDB database access. However, each service only has access to the credentials that it needs to operate, which provides some level of security through &amp;ldquo;separation of concerns&amp;rdquo; (versus universal access).&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 7: Externalize Microservice Configuration</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/</link><pubDate>Mon, 30 Jan 2023 15:43:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/</guid><description>&lt;p&gt;Our decided next step for this project takes us in a new direction by adding externalized configuration for our applications.&lt;/p&gt;
&lt;p&gt;We already saw how to do something similar with &lt;a href="https://jmhreif.com/blog/microservices-level5/" target="_blank" rel="noopener noreferrer"&gt;MongoDB database credentials in Docker Compose&lt;/a&gt;
 to access a local database container, but what do we do when the database is hosted on public cloud or contains sensitive data?&lt;/p&gt;
&lt;p&gt;We probably don&amp;rsquo;t want to publish our credentials anywhere or even prevent accidental publishing.&lt;/p&gt;</description></item><item><title>Modular Monolithic in Practice</title><link>https://foojayio.github.io/website/today/modular-monolithic-in-practice/</link><pubDate>Wed, 25 Jan 2023 08:01:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/modular-monolithic-in-practice/</guid><description>&lt;p&gt;With the usage of microservices in application modernization, we have seen both the advantages and disadvantages of maintaining such software development styles.&lt;/p&gt;
&lt;p&gt;When we create applications mostly in enterprise organizations, the first thing that comes to our mind now is how to decouple our applications.&lt;/p&gt;
&lt;p&gt;But there will be times when creating too many microservices is not the best way and may cost you time and money.&lt;/p&gt;
&lt;p&gt;Because of that, one alternative is to leverage the use of modules.&lt;/p&gt;</description></item><item><title>Spring Boot Annotation Reference-01/b</title><link>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-b/</link><pubDate>Fri, 06 Jan 2023 09:54:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-b/</guid><description>&lt;p&gt;&lt;strong&gt;In the second part of my article series on Spring Boot Annotations, we focus on REST and Spring Stereotype Annotations.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In continuation of &lt;a href="https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-a/"&gt;part 01/a of this article&lt;/a&gt;
, let&amp;rsquo;s continue our Spring Boot Annotations journey.&lt;/p&gt;
&lt;p&gt;What percentage (depth and extent) of Spring Boot Annotations do you think you really know? This includes annotations in all their glory and the power that they bring via all of their options. I am sure whatever your answer may be, you will appreciate this quote from Albert Einstein: &amp;ldquo;The more I learn, the more I realize how much I don&amp;rsquo;t know.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Spring Modulith: Have We Reached Modularity Maturity?</title><link>https://foojayio.github.io/website/today/spring-modulith-modularity-maturity/</link><pubDate>Thu, 29 Dec 2022 07:07:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-modulith-modularity-maturity/</guid><description>&lt;p&gt;One of the main reasons to design microservices is that they enforce &lt;a href="https://martinfowler.com/articles/microservice-trade-offs.html#boundaries" target="_blank" rel="noopener noreferrer"&gt;strong module boundaries&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;However, the cons of microservices are so huge that it&amp;rsquo;s like chopping off your right hand to learn to write with the left one; there are more manageable (and less painful!) ways to achieve the same result.&lt;/p&gt;
&lt;p&gt;Even since the microservices craze started, some cooler heads have prevailed.&lt;/p&gt;
&lt;p&gt;In particular, &lt;a href="https://twitter.com/odrotbohm" target="_blank" rel="noopener noreferrer"&gt;Oliver Drotbohm&lt;/a&gt;
, a developer on the Spring framework, has been a long-time proponent of the &lt;a href="https://github.com/moduliths/moduliths" target="_blank" rel="noopener noreferrer"&gt;moduliths&lt;/a&gt;
 alternative.&lt;/p&gt;</description></item><item><title>Spring Boot Annotation Reference - 01/a</title><link>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-a/</link><pubDate>Thu, 22 Dec 2022 09:57:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-annotation-reference-01-a/</guid><description>&lt;p&gt;In 2018, I was introduced to the topic of Microservices and Spring Boot via a formal training, during my brief stint as a Senior Architect in Manila, Philippines.&lt;/p&gt;
&lt;p&gt;Though I had worked on a &amp;lsquo;similar architecture&amp;rsquo; way back in 2007-&amp;lsquo;08 while working as a Software Engineer at Symantec - I found the idea of the Uber JAR really exciting. Also, since it will now be enforced via the most popular framework brings in more possibilities.&lt;/p&gt;</description></item><item><title>SpringOne TLV World Tour Trip Report</title><link>https://foojayio.github.io/website/today/springone-tlv-world-tour-trip-report/</link><pubDate>Fri, 09 Dec 2022 22:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/springone-tlv-world-tour-trip-report/</guid><description>&lt;p&gt;My talk was accepted by SpringOne in San Francisco. I never went to that conference and was really looking forward to it. This year would probably be amazing with the Spring 6.0 and Spring Boot 3.0 releases. So many groundbreaking changes. Unfortunately, my travel budget at Lightrun was cut, and I eventually left. This meant I had to cancel the trip, I would have paid for travel, but San Francisco is both far and prohibitively expensive. I&amp;rsquo;ll have to take a raincheck.&lt;/p&gt;</description></item><item><title>Clean Ways to Shutdown Spring Boot Applications</title><link>https://foojayio.github.io/website/today/clean-shutdown-of-spring-boot-applications/</link><pubDate>Fri, 04 Nov 2022 14:11:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-shutdown-of-spring-boot-applications/</guid><description>&lt;p&gt;For the last three to four years, I have been working on Spring Boot and its associations, such as Spring Cloud, Spring Data, and Spring Security.&lt;/p&gt;
&lt;p&gt;I have always been tempted to use the combination of Ctrl+C and task kill for the purpose of killing Spring Boot applications or processes. It can be automated by a batch script, but usually I was quite lazy to do this myself, as the combination of actions used to serve the purpose!&lt;/p&gt;</description></item><item><title>Starting Docker Desktop with Spring Boot</title><link>https://foojayio.github.io/website/today/starting-docker-desktop-with-spring-boot/</link><pubDate>Fri, 30 Sep 2022 05:37:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/starting-docker-desktop-with-spring-boot/</guid><description>&lt;br /&gt;
&lt;p&gt;I came across Docker Desktop for the first time about three years ago, when I was working as a Principal Architect (Strategic R &amp;amp; D) on the Microservices Reference Architecture for a product development organization.&lt;/p&gt;
&lt;p&gt;At that time, when I was working on my corporate laptop - It became a tedious task to configure virtualization and settings to get it to work. Once I got it running smoothly, I realized that the memory requirements required to run it is quite high. At times, I found it tough to use my laptop for daily development with it running. It was also because I was working on microservices and had almost 6+ spring boot applications running.&lt;/p&gt;</description></item><item><title>Baeldung Series Part 2: Build a Dashboard With Cassandra, Astra and CQL – Mapping Event Data</title><link>https://foojayio.github.io/website/today/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/</link><pubDate>Tue, 13 Sep 2022 17:46:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/</guid><description>&lt;h2 id="h2-0-1-introduction"&gt;&lt;strong&gt;1. Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In our &lt;a href="https://www.baeldung.com/cassandra-astra-rest-dashboard-updates" target="_blank" rel="noopener noreferrer"&gt;previous article&lt;/a&gt;
, we looked at augmenting our dashboard to store and display individual events from the Avengers using &lt;a href="https://astra.dev/3DnYCl8" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra&lt;/a&gt;
, a serverless DBaaS powered by &lt;a href="https://cassandra.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 using &lt;a href="https://stargate.io/?utm_medium=referral&amp;amp;utm_source=baeldung&amp;amp;utm_campaign=series-1-of-3&amp;amp;utm_content=avengers-dash-series-1" target="_blank" rel="noopener noreferrer"&gt;Stargate&lt;/a&gt;
 to offer additional APIs for working with it.&lt;/p&gt;
&lt;p&gt;In this article, we will be making use of the exact same data in a different way. &lt;strong&gt;We are going to allow the user to select which of the Avengers to display, the time period of interest, and then display these events on an interactive map.&lt;/strong&gt; Unlike in the previous article, this will allow the user to see the data interacting with each other in both geography and time.&lt;/p&gt;</description></item><item><title>End-to-End Tracing with OpenTelemetry</title><link>https://foojayio.github.io/website/today/end-to-end-tracing-opentelemetry/</link><pubDate>Mon, 29 Aug 2022 14:24:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/end-to-end-tracing-opentelemetry/</guid><description>&lt;p&gt;Whether you implement microservices or not (and you probably shouldn&amp;rsquo;t), your system is most probably composed of multiple components.&lt;/p&gt;
&lt;p&gt;The most straightforward system is probably made of a reverse proxy, an app, and a database.&lt;/p&gt;
&lt;p&gt;In this case, monitoring is not only a good idea; it&amp;rsquo;s a requirement.&lt;/p&gt;
&lt;p&gt;The higher the number of components through which a request may flow, the strongest the requirement.&lt;/p&gt;
&lt;p&gt;However, monitoring is only the beginning of the journey.&lt;/p&gt;</description></item><item><title>When Disaster Strikes: Production Troubleshooting</title><link>https://foojayio.github.io/website/today/when-disaster-strikes-production-troubleshooting/</link><pubDate>Fri, 12 Aug 2022 11:03:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-disaster-strikes-production-troubleshooting/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/TomGranot/" target="_blank" rel="noopener noreferrer"&gt;Tom Granot&lt;/a&gt;
 and &lt;a href="https://twitter.com/debugagent/" target="_blank" rel="noopener noreferrer"&gt;myself&lt;/a&gt;
 have had the privilege of &lt;a href="https://twitter.com/vlad_mihalcea" target="_blank" rel="noopener noreferrer"&gt;Vlad Mihalcea&amp;rsquo;s&lt;/a&gt;
 online company for a while now. As a result we decided to &lt;a href="https://go.lightrun.com/production-troubelshooting-masterclass" target="_blank" rel="noopener noreferrer"&gt;do a workshop together&lt;/a&gt;
 talking about a lot of the things we learned in the process. This workshop would be pretty informal ad-hoc, just a bunch of guys chatting and showing off what we can do with tooling.&lt;/p&gt;
&lt;p&gt;In celebration of that I thought I&amp;rsquo;d write about some of the tricks we discussed amongst ourselves in the past to give you a sense of what to expect when joining us for the workshop but also a useful tool in its own right.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 6: Build a Neo4j Microservice</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-6-build-a-neo4j-microservice/</link><pubDate>Wed, 13 Jul 2022 15:13:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-6-build-a-neo4j-microservice/</guid><description>&lt;p&gt;For our next adventure in Java microservices, we want to expand our system for book review data.&lt;/p&gt;
&lt;p&gt;While books and authors are well-suited for a document database such as MongoDB, once you add reviews to the mix, the importance of the relationships makes this project better suited for a graph database.&lt;/p&gt;
&lt;p&gt;This way, we can utilize relationships between the different entities to improve analysis based on the structure of the connections.&lt;/p&gt;</description></item><item><title>Spring Boot Performance Workshop with Vlad Mihalcea</title><link>https://foojayio.github.io/website/today/spring-boot-performance-workshop-with-vlad-mihalcea/</link><pubDate>Fri, 24 Jun 2022 07:43:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-performance-workshop-with-vlad-mihalcea/</guid><description>&lt;p&gt;A couple of weeks ago, we had a great time hosting the workshop you can see below with Vlad Mihalcea. It was loads of fun and we hope to do this again soon!&lt;/p&gt;
&lt;p&gt;In this workshop, we focused on Spring Boot performance but most importantly on Hibernate performance, which is a common issue in production environments.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s especially hard to track since issues related to data are often hard to perceive when debugging locally. When we have &amp;ldquo;real world&amp;rdquo; data at scale, they suddenly balloon and become major issues.&lt;/p&gt;</description></item><item><title>Spring Transaction Debugging in Production with Lightrun</title><link>https://foojayio.github.io/website/today/spring-transaction-debugging-in-production-with-lightrun/</link><pubDate>Fri, 06 May 2022 15:00:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-transaction-debugging-in-production-with-lightrun/</guid><description>&lt;p&gt;Spring makes building a reliable application much easier thanks to its declarative transaction management.&lt;/p&gt;
&lt;p&gt;It also supports programmatic transaction management, but that&amp;rsquo;s not as common.&lt;/p&gt;
&lt;p&gt;In this article, I want to focus on the declarative transaction management angle, since it seems much harder to debug compared to the programmatic approach. This is partially true. We can&amp;rsquo;t put a breakpoint on a transactional annotation.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m getting ahead of myself!&lt;/p&gt;
&lt;h2 id="h2-0-what-is-spring-s-method-declarative-transaction-management"&gt;What is Spring&amp;rsquo;s Method Declarative Transaction Management?&lt;/h2&gt;
&lt;p&gt;When writing a spring method or class, we can use annotations to declare that a method or a bean (class) is transactional. This annotation lets us tune transactional semantics using attributes. This lets us define behavior such as:&lt;/p&gt;</description></item><item><title>Spring4Shell: The zero-day RCE in the Spring Framework explained</title><link>https://foojayio.github.io/website/today/spring4shell-the-zero-day-rce-in-the-spring-framework-explained-ready/</link><pubDate>Fri, 08 Apr 2022 04:17:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring4shell-the-zero-day-rce-in-the-spring-framework-explained-ready/</guid><description>&lt;p&gt;On March 30, 2022, a critical &lt;a href="https://snyk.io/vuln/SNYK-JAVA-ORGSPRINGFRAMEWORK-2436751" target="_blank" rel="noopener noreferrer"&gt;remote code execution (RCE) vulnerability&lt;/a&gt;
 was found in the Spring Framework. More specifically, it is part of the &lt;code&gt;spring-beans&lt;/code&gt; package, a transitive dependency in both &lt;code&gt;spring-webmvc&lt;/code&gt; and &lt;code&gt;spring-webflux&lt;/code&gt;. This vulnerability is another example of why &lt;a href="https://snyk.io/blog/preventing-malicious-packages-and-supply-chain-attacks-with-snyk/" target="_blank" rel="noopener noreferrer"&gt;securing the software supply chain&lt;/a&gt;
 is important to open source.&lt;/p&gt;
&lt;p&gt;Security resources like &lt;a href="https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/" target="_blank" rel="noopener noreferrer"&gt;Lunasec&lt;/a&gt;
, &lt;a href="https://www.rapid7.com/blog/post/2022/03/30/spring4shell-zero-day-vulnerability-in-spring-framework/" target="_blank" rel="noopener noreferrer"&gt;Rapid7&lt;/a&gt;
 and &lt;a href="https://www.praetorian.com/blog/spring-core-jdk9-rce/" target="_blank" rel="noopener noreferrer"&gt;Praetorian&lt;/a&gt;
 confirmed that the vulnerability is real, and in the meantime, Spring has already released a new version that mitigates this problem, so &lt;a href="https://snyk.io/blog/is-there-such-a-thing-as-spring4shell/" target="_blank" rel="noopener noreferrer"&gt;we recommend updating&lt;/a&gt;
. While &lt;strong&gt;Spring4Shell&lt;/strong&gt; does not appear to have the same impact as the recent Log4Shell vulnerability, it should still be evaluated and prioritized by every organization using the Spring Framework. In this post, we&amp;rsquo;ll explore how the RCE works.&lt;/p&gt;</description></item><item><title>Spring Remote Code Execution Vulnerability</title><link>https://foojayio.github.io/website/today/spring-remote-code-execution-vulnerability/</link><pubDate>Thu, 31 Mar 2022 14:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-remote-code-execution-vulnerability/</guid><description>&lt;p&gt;I&amp;rsquo;d like to start by saying that I&amp;rsquo;m not a security expert. I also won&amp;rsquo;t link to the exploit. This is a very fresh take on a new vulnerability but there&amp;rsquo;s &lt;a href="https://blog.sonatype.com/new-0-day-spring-framework-vulnerability-confirmed" target="_blank" rel="noopener noreferrer"&gt;already confirmation from Sonatype&lt;/a&gt;
. The current exploit seems to be limited to Spring on top of Tomcat but it probably can be adapted since the underlying vulnerability seems general enough.&lt;/p&gt;
&lt;p&gt;The vulnerability only impacts Java 9 or newer so if you have an older version you should be safe from this specific exploit.&lt;/p&gt;</description></item><item><title>Blink a LED on Raspberry Pi with Vaadin</title><link>https://foojayio.github.io/website/today/blink-a-led-on-raspberry-pi-with-vaadin/</link><pubDate>Fri, 25 Mar 2022 14:44:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/blink-a-led-on-raspberry-pi-with-vaadin/</guid><description>&lt;p&gt;As I&amp;rsquo;m becoming a senior developer, at least in terms of age, I&amp;rsquo;ve transitioned from one language to another.&lt;/p&gt;
&lt;p&gt;One of my main interests has always been clean, easy-to-understand UIs (User Interfaces). That journey started for me with &lt;strong&gt;Director&lt;/strong&gt; (to create multimedia CD-ROMs), &lt;strong&gt;Flash&lt;/strong&gt; website animation, and &lt;strong&gt;Flex&lt;/strong&gt; Rich Internet Applications (= &amp;ldquo;Flash on steroids&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;When I started developing with &lt;strong&gt;Java&lt;/strong&gt; over 10 years ago, we had some projects with the early versions of &lt;strong&gt;Vaadin&lt;/strong&gt; and &lt;strong&gt;JavaFX&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Building Reactive Java Applications with Spring Framework</title><link>https://foojayio.github.io/website/today/building-reactive-java-applications-with-spring-framework/</link><pubDate>Tue, 15 Feb 2022 14:09:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-reactive-java-applications-with-spring-framework/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/building-reactive-java-applications-with-spring-framework/1_bAqotS_F1PipZLOHx_Tcww-1024x403.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In one of our many free tutorials on&lt;/em&gt; &lt;a href="https://www.youtube.com/c/DataStaxDevs/videos" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;DataStax Developers YouTube channel&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;, we walked you through&lt;/em&gt; &lt;a href="https://www.youtube.com/watch?v=1aRbndIcXV4" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;how to build a reactive implementation of Spring PetClinic&lt;/em&gt;&lt;/a&gt;
in &lt;em&gt;Apache Cassandra® using Spring WebFlux. The full series is&lt;/em&gt; &lt;a href="https://github.com/datastaxdevs/workshop-spring-reactive" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;available on YouTube&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;.&lt;/em&gt;{#08a7}&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a Java developer who uses the Spring ecosystem, you&amp;rsquo;ve probably seen the &lt;a href="https://github.com/datastaxdevs/workshop-spring-reactive" target="_blank" rel="noopener noreferrer"&gt;Spring Pet Clinic&lt;/a&gt;
. In this workshop, we will walk you through a new reactive implementation of the Pet Clinic backend that uses Spring WebFlux and Apache &lt;a href="https://www.datastax.com/what-is/cassandra" target="_blank" rel="noopener noreferrer"&gt;Cassandra&lt;/a&gt;
® (via &lt;a href="https://astra.dev/3lSpuQp" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra DB&lt;/a&gt;
).{#47b5}&lt;/p&gt;</description></item><item><title>Statically Spilling Your (Spring) Beans</title><link>https://foojayio.github.io/website/today/statically-spilling-your-spring-beans/</link><pubDate>Mon, 24 Jan 2022 11:25:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/statically-spilling-your-spring-beans/</guid><description>&lt;p&gt;UPDATE - To make it abundantly clear:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You should always try to refactor your code so you do not need this approach (something I&amp;rsquo;ll dive into in a follow up blogpost I&amp;rsquo;m working on).&lt;/strong&gt; There may be some edge cases where there truly is no other way but those situations are rare. Always try to refactor!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using this method can lead to &lt;em&gt;multiple unexpected and hard to debug issues&lt;/em&gt; as it does not follow the regular Spring Framework concepts.&lt;/strong&gt; As such, this approach is considered &lt;strong&gt;A VERY BAD IDEA&lt;/strong&gt; .&lt;/p&gt;</description></item><item><title>Build a Status Dashboard Using Spring Boot and Astra DB</title><link>https://foojayio.github.io/website/today/build-a-status-dashboard-using-spring-boot-and-astra-db/</link><pubDate>Fri, 17 Dec 2021 09:28:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/build-a-status-dashboard-using-spring-boot-and-astra-db/</guid><description>&lt;p&gt;In this article, we are going to build &amp;ldquo;Tony Stark&amp;rsquo;s Avengers Status Dashboard&amp;rdquo;, used by The Avengers to monitor the status of the members of the team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This will be built using &lt;a href="https://astra.dev/3BJ1lmW" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra&lt;/a&gt;
, a DBaaS powered by &lt;a href="https://cassandra.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 using &lt;a href="https://stargate.io/?utm_medium=referral&amp;amp;utm_source=baeldung&amp;amp;utm_campaign=series-1-of-3&amp;amp;utm_content=avengers-dash-series-1" target="_blank" rel="noopener noreferrer"&gt;Stargate&lt;/a&gt;
 to offer additional APIs for working with it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On top of this, we will be using a Spring Boot application to render the dashboard and show what&amp;rsquo;s going on.&lt;/p&gt;</description></item><item><title>Non-blocking with Spring WebFlux, Kotlin and Coroutines</title><link>https://foojayio.github.io/website/today/build-and-test-non-blocking-web-applications-with-spring-webflux-kotlin-and-coroutines/</link><pubDate>Thu, 09 Dec 2021 14:03:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/build-and-test-non-blocking-web-applications-with-spring-webflux-kotlin-and-coroutines/</guid><description>&lt;p&gt;When a HTTP request comes in, a &amp;rsquo;normal&amp;rsquo; web application would map the request to a specific thread from the thread pool. This assigned thread stays with the request until a response can be returned to the request socket. Along the way, we might need to fetch data from some web service or database, read or write to a file or do other I/O calls, during which the thread is blocked and has to wait until it gets a response. For applications with high request rates, the thread pool can at some point become exhausted and then no new requests can be handled anymore.&lt;/p&gt;</description></item><item><title>Multiple Spring Boot Applications in the Same Project</title><link>https://foojayio.github.io/website/today/multiple-spring-boot-apps-same-project/</link><pubDate>Wed, 08 Dec 2021 16:42:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/multiple-spring-boot-apps-same-project/</guid><description>&lt;p&gt;I frequently use the &lt;a href="https://spring.io/projects/spring-boot" target="_blank" rel="noopener noreferrer"&gt;Spring Boot&lt;/a&gt;
 framework in my demos. The latest one is no different. It shows how to achieve using two different code paths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the command part is implemented via &lt;a href="https://spring.io/projects/spring-data-jpa" target="_blank" rel="noopener noreferrer"&gt;Spring Data JPA&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;the query part via &lt;a href="https://www.jooq.org/" target="_blank" rel="noopener noreferrer"&gt;jOOQ&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My use case is a banking application that offers a REST layer allowing clients to call any parts. Demoing the query part is easy enough with &lt;code&gt;curl&lt;/code&gt; as the URL is not complex:&lt;/p&gt;</description></item><item><title>Native-image with Spring Boot</title><link>https://foojayio.github.io/website/today/native-spring-boot/</link><pubDate>Fri, 19 Nov 2021 11:47:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-spring-boot/</guid><description>&lt;p&gt;The Cloud has enabled a lot of new usages that were not possible before. Among them stands Serverless:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Serverless computing is a cloud computing execution model in which the cloud provider allocates machine resources on demand, taking care of the servers on behalf of their customers. Serverless computing does not hold resources in volatile memory; computing is rather done in short bursts with the results persisted to storage. When an app is not in use, there are no computing resources allocated to the app.&lt;/p&gt;</description></item><item><title>A Walk to Lazy Fetching With Hibernate and Spring Data JPA</title><link>https://foojayio.github.io/website/today/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/</link><pubDate>Wed, 17 Nov 2021 11:47:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/</guid><description>&lt;figure class="wp-block-image is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" src="oie_koKWLHXsUxuL.jpg" alt="" style="width:452px;height:226px" width="452" height="226"&gt;
&lt;/figure&gt;
&lt;h3 id="h3-0-background"&gt;Background&lt;/h3&gt;
&lt;p&gt;Using &lt;code&gt;FetchType.EAGER&lt;/code&gt; is a very bad practice, since our services may not require all the data of the mapped entities in all cases. And moreover, it is a bad idea to fetch so much data in a single session and makes the session heavy.&lt;/p&gt;
&lt;p&gt;Therefore we will refactor the code and use &lt;code&gt;FetchType.LAZY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Our old code for the entity was below:
&lt;img src="https://foojayio.github.io/website/today/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-445x510.png" alt="Domain model with fetch type EAGER" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;After using FetchType.LAZY our new code will be like below:
&lt;img src="https://foojayio.github.io/website/today/a-walk-to-lazy-fetching-with-hibernate-and-spring-data-jpa/1_Tr3xvq9hSvqoK3LHNaib6g-1-441x510.png" alt="Domain model with fetch type LAZY" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title>Multiple Ways to Configure Spring</title><link>https://foojayio.github.io/website/today/multiple-ways-configure-spring/</link><pubDate>Wed, 06 Oct 2021 08:55:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/multiple-ways-configure-spring/</guid><description>&lt;p&gt;Two weeks ago, I wrote how you could write a Spring application with no annotations.&lt;/p&gt;
&lt;p&gt;Many alternatives are available to configure your Spring app.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to list them in this post, leaving Spring Boot out of the picture on purpose.&lt;/p&gt;
&lt;h2 id="h2-0-core-concepts"&gt;Core concepts&lt;/h2&gt;
&lt;p&gt;A couple of concepts are central in Spring. The related documentation doesn&amp;rsquo;t describe most of them. Here is my understanding of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bean&lt;/strong&gt; : A bean is an object managed by the Spring container&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bean Factory&lt;/strong&gt; : A bean factory is a component that manages the lifecycle of &lt;em&gt;beans&lt;/em&gt;, especially regarding the instantiation of new objects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bean Definition&lt;/strong&gt; : A bean definition is the set of properties given to the Spring container and that the requested bean will have, &lt;em&gt;e.g.&lt;/em&gt;, class, name, scope, dependencies, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context&lt;/strong&gt;: A context is a bean factory with additional capabilities (mainly internationalization and event publishing)&lt;/li&gt;
&lt;/ul&gt;
&lt;img fetchpriority="high" decoding="async" class="aligncenter size-medium wp-image-49678" src="spring-concepts-700x492.png" alt="" width="700" height="492"&gt;
&lt;br /&gt;
&lt;p&gt;To configure a Spring application, one creates one or more contexts and registers the necessary bean definitions in the desired ones. In the following sections, we will configure the following simple model:&lt;/p&gt;</description></item><item><title>VS Code: SpringOne Updates, UX Improvements, Community Feedback</title><link>https://foojayio.github.io/website/today/vs-code-java-august-updates-springone-updates-ux-improvements-community-feedback/</link><pubDate>Mon, 20 Sep 2021 06:46:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/vs-code-java-august-updates-springone-updates-ux-improvements-community-feedback/</guid><description>&lt;p&gt;Hi everyone, welcome to the August edition of the Visual Studio Code Java update!&lt;/p&gt;
&lt;p&gt;In this article, we are going to share some exciting updates from the SpringOne 2021 conference, as well as various user experience improvements.&lt;/p&gt;
&lt;p&gt;When it comes to Java development, we always keep Spring developers in mind. In this year&amp;rsquo;s &lt;a href="https://devblogs.microsoft.com/java/join-microsoft-at-springone-2021/" title="SpringOne conference" target="_blank" rel="noopener noreferrer"&gt;SpringOne conference&lt;/a&gt;
, we shared an update on our Spring tooling support in Visual Studio Code, and showcased various Spring related features in two breakout sessions.&lt;/p&gt;</description></item><item><title>A Return to Annotation-Free Spring</title><link>https://foojayio.github.io/website/today/annotation-free-spring/</link><pubDate>Fri, 17 Sep 2021 12:03:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/annotation-free-spring/</guid><description>&lt;p&gt;Some, if not most, of our judgments regarding technology stacks come either from third-party opinions or previous experiences. Yet, we seem to be adamant about them. For a long time (and sometimes even now), I&amp;rsquo;ve seen posts that detailed how Spring is bad because it uses XML for its configuration. Unfortunately, they blissfully ignore the fact that annotation-based configuration has been available for ages.&lt;/p&gt;
&lt;p&gt;And probably for of the same reason, I recently read that Spring is bad&amp;hellip; &lt;em&gt;because of annotations&lt;/em&gt;. If you belong to this crowd, I&amp;rsquo;ve news for you: you can get rid of most annotations and even more so if you&amp;rsquo;re using Kotlin.&lt;/p&gt;</description></item><item><title>Better Error Handling for Your Spring Boot REST APIs</title><link>https://foojayio.github.io/website/today/better-error-handling-for-your-spring-boot-rest-apis/</link><pubDate>Sat, 21 Aug 2021 07:41:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/better-error-handling-for-your-spring-boot-rest-apis/</guid><description>&lt;p&gt;One of the things that distinguishes a decent API from one that is a pleasure to work with is robust error handling. Nothing is more frustrating than using some API and getting back cryptic errors where you can only guess why the server is not accepting your request.&lt;/p&gt;
&lt;p&gt;Spring Boot lets you &lt;a href="https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc" target="_blank" rel="noopener noreferrer"&gt;customize the error handling&lt;/a&gt;
 for your application, but there is quite a lot of low-level coding involved if you want to do this correctly. What consititutes good error handling and good error responses in particular might be up for debate, but I think we can agree on a few general guidelines:&lt;/p&gt;</description></item><item><title>Creating a Simple Spring Boot Application in IntelliJ IDEA</title><link>https://foojayio.github.io/website/today/creating-a-simple-spring-boot-application-in-intellij-idea/</link><pubDate>Mon, 31 May 2021 17:06:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-a-simple-spring-boot-application-in-intellij-idea/</guid><description>&lt;p&gt;This tutorial uses IntelliJ IDEA Ultimate because we want to create a new project using Spring Initializr. This functionality is only available with IntelliJ IDEA Ultimate. It is based off &lt;a href="https://spring.io/guides/gs/spring-boot/" target="_blank" rel="noopener noreferrer"&gt;Building an Application with Spring Boot&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="h2-0-creating-your-spring-boot-project"&gt;Creating your Spring Boot Project&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re in an IntelliJ IDEA project already, select &lt;strong&gt;File&lt;/strong&gt; &amp;gt; &lt;strong&gt;Project&lt;/strong&gt; . Alternatively click the &lt;strong&gt;New Project&lt;/strong&gt; button on the Welcome screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Spring Initializr&lt;/strong&gt; on the left-hand side and then enter the following options:&lt;/p&gt;</description></item><item><title>Building Microservices with Spring Boot Fat (Uber) Jar</title><link>https://foojayio.github.io/website/today/building-microservices-spring-boot-fat-uber-jar/</link><pubDate>Wed, 21 Apr 2021 09:28:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-microservices-spring-boot-fat-uber-jar/</guid><description>&lt;p&gt;In most minds,&lt;em&gt;microservices&lt;/em&gt; is an approach to make a traditional monolithic system more structured, dividing it into logical components that correspond to different functional areas of application. Thus, acting as a microservice, each component becomes self-contained, easily scaled, maintained and even upgraded without affecting the overall system. Also, with &lt;em&gt;microservice&lt;/em&gt; architecture, you can use a software written in different programming languages, including Java. Such freedom attracts but may frighten at the same time.&lt;/p&gt;</description></item><item><title>Running Spring Boot Applications on OpenShift</title><link>https://foojayio.github.io/website/today/running-spring-boot-applications-on-openshift/</link><pubDate>Thu, 04 Mar 2021 08:36:17 +0000</pubDate><guid>https://foojayio.github.io/website/today/running-spring-boot-applications-on-openshift/</guid><description>&lt;p&gt;This article will demonstrate how to deploy a Spring Boot application on OpenShift (Minishift).&lt;/p&gt;
&lt;h3 id="h3-0-introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Cloud platforms have dramatically changed the way we develop and deploy modern applications. Not so long ago, everything was on-premise infra. However, things have changed dramatically over the years. Now, there are a number of vendors offering solutions for different cloud computing models, i.e., Saas, Paas, and Iaas.&lt;/p&gt;
&lt;p&gt;This article will cover Openshift developed by Redhat, which comes under the Paas cloud computing model.&lt;/p&gt;</description></item><item><title>Monitoring Across Frameworks: Spring Boot, Quarkus, Micronaut, Helidon</title><link>https://foojayio.github.io/website/today/monitoring-across-frameworks-spring-boot-micronaut-quarkus-and-helidon/</link><pubDate>Tue, 02 Mar 2021 18:44:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/monitoring-across-frameworks-spring-boot-micronaut-quarkus-and-helidon/</guid><description>&lt;p&gt;Gone are the times when developers&amp;rsquo; jobs ended with the release of the application. Nowadays, developers care more and more about the operational side of IT: perhaps they operate applications themselves, but more probably, their organizations foster increased collaboration between Dev and Ops.&lt;/p&gt;
&lt;p&gt;I started to become interested in the Ops side of software when I was still a consultant. When Spring Boot released the Actuator, I became excited. Via its convention-over-configuration nature, it was possible to add monitoring endpoints with just an additional dependency.&lt;/p&gt;</description></item><item><title>Containerizing Spring Boot Applications with Jib</title><link>https://foojayio.github.io/website/today/containerizing-spring-boot-applications-with-jib/</link><pubDate>Tue, 29 Dec 2020 19:29:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/containerizing-spring-boot-applications-with-jib/</guid><description>&lt;p&gt;In this post, we will learn about how to create docker or &lt;a href="https://opencontainers.org/" title="OCI" target="_blank" rel="noopener noreferrer"&gt;OCI&lt;/a&gt;
 compliant images, without installing any docker client and without using a Dockerfile, for a Spring Boot application.&lt;/p&gt;
&lt;p&gt;We will be doing all of this with the help of Jib.&lt;/p&gt;
&lt;h4 id="what-is-jib"&gt;What Is Jib?&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Jib is Java containerizer from Google that lets Java developers build containers using build tools like Maven and Gradle.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But that&amp;rsquo;s not all that is really interesting about Jib because you don&amp;rsquo;t need to know anything about installing docker, maintaining Dockerfiles, etc.&lt;/p&gt;</description></item><item><title>Spring Boot: Strategy Design Pattern - Convenience and Limitation</title><link>https://foojayio.github.io/website/today/spring-boot-strategy-design-pattern-convenience-and-limitation/</link><pubDate>Fri, 30 Oct 2020 09:22:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-boot-strategy-design-pattern-convenience-and-limitation/</guid><description>&lt;p&gt;You might have already used the &lt;a href="https://en.wikipedia.org/wiki/Strategy_pattern" target="_blank" rel="noopener noreferrer"&gt;strategy pattern&lt;/a&gt;
 in relationship with Spring Boot where it is very convenient to use.&lt;/p&gt;
&lt;p&gt;You simply define an interface for example (I use the prefixing &lt;code&gt;I&lt;/code&gt; only in these examples for clarity):&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;public interface IOneStrategy {
 void executeTheThing();
}&lt;/pre&gt;
&lt;p&gt;Define some implementations like this:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;@Service("FIRST")
public class OneStrategyFirst implements IOneStrategy {

 @Override
 public void executeTheThing() {
 System.out.println("OneStrategyFirst.executeTheThing");
 }
}&lt;/pre&gt;
&lt;p&gt;Now you can simply implement a service which will execute the appropriate strategy based on the given name which looks similar like this:&lt;/p&gt;</description></item><item><title>Getting Started with a Simple Service with Spring Boot</title><link>https://foojayio.github.io/website/today/a-simple-service-with-spring-boot/</link><pubDate>Tue, 22 Sep 2020 12:59:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-simple-service-with-spring-boot/</guid><description>&lt;p&gt;In this post, I will demonstrate how to create a simple Web Service using Spring Boot. This framework makes it almost effortless to develop web services, so long as the appropriate dependencies are in place.&lt;/p&gt;
&lt;p&gt;In this example, I will create a Web Service that will read the current temperature from a file and make it available to clients via a RESTful endpoint.&lt;/p&gt;
&lt;h4 id="1-use-the-spring-intializr"&gt;1. Use the Spring Intializr&lt;/h4&gt;
&lt;p&gt;The Spring Initializr helps one to choose the dependencies that are required for production a particular solution.&lt;/p&gt;</description></item></channel></rss>