14 Jul 2026
DZone Java Zone
Compliance Reporting Without Losing the Spreadsheet or the Control
Compliance-reporting teams keep spreadsheets in the loop for a practical reason: a workbook lets domain experts inspect assumptions, formulas, source rows, and intermediate values without reading a line of application code. That transparency is genuinely useful, and it's a big part of why replacing Excel outright so often fails to stick.
The trouble starts once that workbook becomes part of a repeatable, audited reporting process - a regulatory filing, an IFRS report, a periodic compliance submission. At that point, a shared Excel file isn't enough on its own. What's actually needed is version control, validation, an audit trail, a review step, and a reliable way to connect the spreadsheet's logic to the systems downstream.
14 Jul 2026 5:00pm GMT
Differential Flamegraphs in Java in Jeffrey Microscope
In the first article, we got started with Jeffrey Microscope and learned to read a single flamegraph - the timeseries, search, tooltips, and the allocation and wall-clock variants. This time we build directly on that foundation and tackle one of Jeffrey's most powerful features for real-world performance work: the differential flamegraph, which compares two recordings and shows you precisely what changed between them.
A single flamegraph tells you where your application spends its time. But the questions that matter most in practice are comparative:
14 Jul 2026 12:00pm GMT
13 Jul 2026
DZone Java Zone
Jeffrey Microscope for Generating Flame Graphs in Java
Java Flight Recorder (JFR) captures an enormous amount of detail about what your application is doing - but raw JFR files are only as useful as the tools you have to explore them. Jeffrey is an open-source JFR analyzer that specializes in turning JFR events into interactive visualizations, and Jeffrey Microscope is its standalone, single-user deployment: a self-contained application that lets you import recordings and dig into flamegraphs, timeseries, and other views right in your browser. Getting started takes a minute:
- Standalone JAR - download the latest
microscope.jarfrom the GitHub releases page and start it withjava -jar microscope.jar(Java 25 or newer). - Docker - skip the setup entirely with
docker run -it --network host petrbouda/microscope. - Sample recordings - if you want to explore the tool before profiling your own application, the
petrbouda/microscope-examplesimage ships with sample recordings preloaded (docker run -it --network host petrbouda/microscope-examples).
In this article, we'll use Jeffrey Microscope to analyze JFR flamegraphs and walk through how they help you find where your application actually spends its time.
13 Jul 2026 2:00pm GMT
10 Jul 2026
DZone Java Zone
Your Codename One App, Now A Native Mac App
Codename One has run on the desktop for a long time through the JavaSE target, which is the same engine that powers the simulator. What it did not have was a real native Mac binary, and the desktop output still carried a lot of phone-shaped habits: a drawn toolbar where the OS menu bar belongs, scrollbars you could not grab, no place in the menu for Preferences or Quit. With version 7.0.250, we finally have an actual native macOS application target that doesn't bundle a JVM and is as native as our iOS target.
A Native Mac Build From the iOS Pipeline
PR #5053 adds a Mac Native target that takes the existing project through the same build as the iPhone builder and the ParparVM pipeline that produces an iOS app. In this case, it emits a native Mac variant of it.
10 Jul 2026 4:00pm GMT
Exploring A Few Java 25 Language Enhancements
Although Java 26 was released in mid-March this year, Java 25 is the latest LTS version available, and thus I chose to focus my attention on it in the first place.
Irrespective of whether certain Java 25 language improvements are still available as preview features or not, this article briefly outlines a few. The main purpose is to first make the developers aware that Java is continuously refined and evolved by its API contributors and secondly, to raise the curiosity and interest of exploring these enhancements in detail.
10 Jul 2026 2:00pm GMT
06 Jul 2026
DZone Java Zone
HTTP QUERY in Java: The Missing Method for Complex REST API Searches
HTTP methods in REST API design are more than technical details; they communicate intent between clients and servers. A GET request instructs the server to retrieve a resource. A POST request typically indicates that data should be processed, often creating a new resource. PUT indicates replacement or update, while DELETE signals removal. These methods are well-established and fundamental to the Web.
Despite this, API design has long faced a notable gap.
06 Jul 2026 5:00pm GMT
03 Jul 2026
DZone Java Zone
OBO SSO in Java Applications: Securely Calling Downstream APIs on Behalf of a User
Modern enterprise applications rarely operate in isolation. A user may authenticate through a web or mobile application, invoke a Java-based backend API, and that backend may need to call additional downstream services such as microservices or third-party APIs.
In these scenarios, simply using the application's identity is often insufficient. The downstream service may need to know which user initiated the request and enforce authorization based on that user's permissions. This is where the OAuth 2.0 On-Behalf-Of (OBO) flow becomes invaluable.
03 Jul 2026 2:00pm GMT
02 Jul 2026
DZone Java Zone
Dead Letter Queue Patterns in Apache Flink: Handling Poison Messages Without Stopping Your Stream
Streaming systems usually fail in one of two ways:
- Loudly, when infrastructure breaks
- Quietly, when one bad record keeps replaying until the pipeline is effectively dead
The second failure mode is more dangerous because it often starts with something small: malformed JSON, an unexpected schema change, a missing required field, or a downstream timeout that was never handled correctly.
02 Jul 2026 1:00pm GMT
19 Jun 2026
DZone Java Zone
Jakarta NoSQL: Why JPA Is Not Enough for the AI Era
The most effective way to present this idea is to begin with the challenge architects face: AI has transformed the persistence landscape. Enterprise applications were once built almost exclusively on relational databases, making JPA a keystone of Jakarta EE.
Today, modern systems use a mix of relational databases, document stores, caches, graph engines, and increasingly, vector databases that support semantic search, retrieval-augmented generation (RAG), and AI-powered applications. Polyglot persistence is now the industry standard. While Jakarta EE standardized relational persistence through JPA, it still lacks a vendor-neutral standard for non-relational persistence. This gap forces developers to rely on fragmented, proprietary solutions, creating barriers to portability, productivity, and innovation.
19 Jun 2026 2:00pm GMT
From printTriangularNumber to Duff’s Device: Mastering Java Switch Statements Old and New
In this blog post, we will see how the humble Java switch statement evolved from a fall-through curiosity into a powerful expression, and how understanding its mechanics unlocks classic techniques like Duff's Device.
Java's switch statement has evolved from a fall-through-prone construct into a modern expression syntax introduced in Java 14. The post traces this evolution using a concrete example, a method that computes triangular numbers by intentionally allowing execution to cascade through cases without break statements.
19 Jun 2026 12:00pm GMT
18 Jun 2026
DZone Java Zone
Top Java Security Vulnerabilities and How to Prevent Them in Modern Java
With the increasing number of security threats, organizations have invested heavily in cybersecurity initiatives to protect their applications, infrastructure, and sensitive data. Security vulnerabilities are rarely introduced intentionally. Most of them creep into applications through shortcuts, overlooked edge cases, outdated libraries, or some bad coding habits.
Modern Java has significantly improved its security capabilities, but no framework or JVM version can completely protect an application from insecure coding practices. As developers, we still need to understand where vulnerabilities originate and how to prevent them before they reach production.
18 Jun 2026 4:00pm GMT
17 Jun 2026
DZone Java Zone
OpenAPI, ORM, SVG, and Lottie
This is the third follow-up to Friday's release post. Saturday's was about how you iterate; yesterday's was about new platform APIs in the core; today's is about a run of pieces that change how you write the structural parts of an app.
The pieces are an OpenAPI client generator, a SQLite ORM, JSON and XML mappers, a component binder with validation, build-time SVG and Lottie transcoders, and a declarative router with deep links. All ride on a single build-time codegen pipeline: a Maven-plugin pass that reads annotations or declarative source files at build time and emits typed Java that compiles into your binary. No reflection, no service loader, no Class.forName. The "How it works" section at the end of this post covers the codegen plumbing once you have seen what it powers.
17 Jun 2026 7:00pm GMT
On-Device Debugging and JUnit 5
This is the first follow-up to Friday's release post, and it covers the two changes from this release that affect how you iterate on a Codename One app rather than what the app itself does. On-device debugging that treats Java as Java on a real iPhone or a real Android device, and standard JUnit 5 against the JavaSE simulator. The first is the one we have been wanting for a long time, and is the one that takes the most explaining, so most of the post is about it.
On-Device Debugging That Treats Java as Java
Codename One has always supported on-device debugging in the strict technical sense. You could attach Xcode to a .ipa, you could attach Android Studio to a running APK, you could read the native call stack, you could step through Objective-C or the C that ParparVM emits. What you could not do was set a breakpoint in MyForm.java, hit it on a real iPhone, and inspect a Java field on a Java object as a Java object. You also could not debug an iOS app without a Mac in the loop somewhere, because the only debugger that understood the binary was Xcode. The translation step between the Java you wrote and the C that ParparVM produces left no way back across the gap on the device.
17 Jun 2026 3:00pm GMT
12 Jun 2026
DZone Java Zone
A Spring Boot App With Half the Startup Time
The MovieManager project has been updated to use JDK 25 and the AOT cache from project Leyden. Project Leyden is part of the OpenJDK project and provides cached linking and cached performance statistics. That means the time spent linking at startup is moved to build time, and the statistics are created during a test run at build time as well.
Because of that, the JVM loads the needed classes already linked and starts compiling the hot code paths immediately. The MovieManager application starts in less than half the time with these optimizations without any code changes.
12 Jun 2026 4:00pm GMT
Implementing the Planning Pattern With Java Enterprise and LangChain4j
Artificial intelligence is evolving beyond basic chat interfaces to play an active role in enterprise applications. While initial AI integrations often focus on text generation, summarization, or retrieval-augmented generation (RAG), many business challenges demand more advanced solutions. These require breaking down complex objectives into sequenced tasks and coordinating their execution. The Planning Pattern addresses this need by enabling AI to function as both a content generator and a strategist that creates execution plans.
For software engineers and architects, the Planning Pattern marks a significant advancement in intelligent systems. It separates reasoning from execution, allowing applications to use large language models while ensuring governance, observability, and reliability in enterprise settings.
12 Jun 2026 2:00pm GMT
11 Jun 2026
DZone Java Zone
Native SQL in Java Without JDBC Boilerplate — Meet Ujorm3
If you've ever written raw JDBC, you know what's coming. Open a connection, create a PreparedStatement, set parameters by index (hope you counted right), iterate a ResultSet, close everything in a finally block, declare SQLException on every method signature… It's a lot of ceremony for "give me some rows."
I've been experimenting with Ujorm3, a new lightweight ORM library for Java 17+. Here's a realistic example - a JOIN query that maps results including a nested relation:
11 Jun 2026 6:00pm GMT