My Devoxx 2025 Experience

And so, another Devoxx has passed. Of course, it is always hard to compare different years; still, this was the best Devoxx I attended. Read on to find out why.
In general, Devoxx is always well‑organised. When looking at the number of people, there is always a talk to go to, and there is always a drink to fetch. The location is superb, except for movie night, when everyone is trying to get some food and the local restaurants are packed. It is a genuine pleasure to attend this conference.
If you are curious about the program or looking for a specific talk. Check out the website. Stephan Jansen did a great thing with this new shiny tool. He was really proud of the real‑time Live Key Takeaways and Live Insights.
https://m.devoxx.com/events/dvbe25
Tuesday
I returned from holiday on Sunday, and Monday evening, Daniël Spee and I drove to Antwerp. In the evening, we did the last preparations for the workshop. Tuesday was the day of our workshop. After our workshop, we had time to visit other workshops or deep dives.
From scratch to scalable. Building smarter AI Agents with frameworks
Jettro Coenradie / Daniël Spee
Tuesday morning was our moment to shine. We presented our workshop, which wasn’t the biggest group ever, but we still received positive feedback from the audience. The average rating was five stars out of five. I have to admit we only got two reviews. The amount of content was too large, so next time we will ask for a day. If you are interested in doing this workshop at your company, drop me an email.
More information about the workshop at Devoxx.
Authorization in Spring Security: permissions, roles and beyond
Daniel Garnier‑Moiroux
A deep dive into Spring Security, some things familiar and some things new. Daniel was my favourite speaker at the Devoxx conference. I attended three sessions with him. I liked the part where he spoke about securing personal profile pages. The idea of securing a page using hasVariable was new to me. You can allow a person to use a particular path only if the PathVariable has a specific value.
authz.requestMatchers("/profile/{username}")
.hasVariable("username")
.equalTo(Principal::getName);
Other interesting topics he discussed include method‑level security with access to the request body and Object‑Level security to prevent specific fields from being delivered to non‑admins.
Hands‑On: Building AI Agents with Embabel
John Davies / James Ward / Rod Johnson
As I have been writing about Embabel for some time now, there haven’t been many new developments for me—still a fun workshop where Embabel is combined with Amazon Bedrock.
I believe Embabel becomes a serious candidate to be the platform of choice for creating agentic applications within an enterprise environment.
A new model for Ollama was mentioned that is worth looking into when available: Apriel.
Speaker dinner
Traditionally, Tuesday evening is the speaker dinner. I had the opportunity to speak with new people, such as Rod Johnson, and catch up with those I already knew, like Arjan Poutsma and Piet van Dongen.
Wednesday
Keynote(s)
Fun to see the son of Stephan Janssen give him an introduction. He became a bit emotional. Fun to hear Stephan talk about Java finally becoming more critical in the world of AI.
The next talk was by Cassandra Chin. She discussed ways to motivate children to engage with technology. Her books look very interesting, something I could have used when my kids were still young.
Up next, Java 25 by Georges Saab and Nicolai Parlog. They discussed making Java a more suitable language for working with AI through the projects Panama and Babylon. I like the new way of running Java files with compact source files.
Below Main.java
void main() {
Scanner scanner = new Scanner(System.in);
IO.print("Enter your name: ");
String name = scanner.nextLine();
IO.println("Hello, " + name + "!");
}
> java Main.java
Enter your name: Jettro
Hello, Jettro!
Next up, Rod Johnson. He had a good talk about Agents, AI and the Java landscape. He had a few nice remarks; my favourite was this one:
The next phase of the AI revolution won’t be written in Python Notebooks.
Overall, a nice presentation to watch if you are interested in AI and work on the JVM.
The final part of the keynote was dedicated to Lize Raes. I always enjoy her presentations; she is an excellent speaker. Of course, she is talking about Langchain4j. She is never scared to show demos. She does this time as well. I lost track of the framework for the last half year or so, but I was impressed by what she showed. I need to dedicate some time to the latest version of the framework.
Testing challenges in the age of AI
Konstantin Pavlov
This talk felt like a tool talk. Konstantin mentioned a variety of different tools, some of which I was familiar with, and some of which I was not. It should have focused more on evaluations and fundamentals, rather than tools.
One thing I did take from the talk is Agents.md. This is an open standard with instructions for coding agents, such as Codex, to enhance their output. I get back to this file when discussing a later talk.
Top 10 Event‑Driven Architecture Pitfalls
Victor Rentea
Victor is special. He delivered three talks at the conference, and all of them were among the top presentations of the conference. He puts a lot of energy into his talks and uses sound fragments. He is one of those speakers who can entertain and teach at the same time.
His insights into using versions and pessimistic locking in an event‑driven application were interesting. He has his own version of EDA (Event‑Driven Architecture): attend an Event, Drive home, and do Architecture. In short, the conference architecture. Throw this new shiny thing everybody talks about at the conference at every problem you see.
I liked his point about Event‑carried State Transfer. Within an event‑driven architecture, it is a regular pattern to contact the repository for more information after receiving an event. Numerous things can go wrong in this situation related to race conditions and failures. Adding more data to the event at the beginning can be very helpful in this situation.
Bootiful Spring AI
Josh Long / James Ward / Christian Tzolov / Mark Pollack
Especially the part where Josh and James are talking is fun to watch. As I work with Spring AI, I did not gain new knowledge from this session. Still, it is fun to listen to Josh while coding like crazy. Spring AI is the framework that brings the JVM to AI.
Oh, and according to Josh, with Java 25, there is finally a good Java script.
Oh, and if you add a shebang line to the Java file from the keynote, you can run the Java as an actual script.
#!/usr/bin/env java --source 25
import java.util.Scanner;
void main() {
Scanner scanner = new Scanner(System.in);
IO.print("Enter your name: ");
String name = scanner.nextLine();
IO.println("Hello, " + name + "!");
}
The New Java Best Practices
Stephen Colebourne
Now that I have returned to the JVM for most of my programming, it is good to look at the new features of Java. I have already mentioned the new Java script options. Other things Stephen discussed are the new modules. In short, they are essential to the JVM, but they are not used. Do use var; it is not scary, you implicitly use it already in lambdas and other constructs. Don’t use instanceOf; replace it with the new construct.
Replace this:
JsonValue root = loadJson();
if (root instanceof JsonObject) {
JsonObject jsonObj = (JsonObject) root;
return jsonObj.getInt("age");
} else {
throw new IllegalArgumentException();
}
With:
JsonValue root = loadJson();
if (root instanceof JsonObject jsonObj) {
return jsonObj.getInt("age");
} else {
throw new IllegalArgumentException();
}
Bootiful Spring Boot
Josh Long
This is a talk about new features in Spring Boot 4 and the Spring Framework 7. Besides new features like versioned REST interfaces, unified annotations through jspecify and retryable annotations, I liked the part where he uses jbang to create a simple script to run a complete web server.
In the other talk about Spring AI, the Java script for Hello World was introduced. Now, if you want to add libraries, you can use jbang. It has a nice way of adding libraries to the classpath through comments in a special format. Josh uses a script loaded from GitHub. Fun to see that works.
Below is the script.
//usr/bin/env jbang "$0" "$@" ; exit $?
//JAVA 25
//DEPS org.springframework.boot:spring-boot-starter-web:3.5.5
//DEPS https://github.com/scratches/spring-script
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
static class HelloController {
@GetMapping("/hi")
Map<String, String> hello() {
return Map.of("message", "hi");
}
}
@Bean
ApplicationRunner standalone() {
return _ -> IO.println(" standalone!!");
}
void main() {
SpringScript.run();
}
Drinks and Food
That was the last talk of the day—time to get some food and drinks. Together with Peter Doornbosch, Daniël Spee, Allon Sander and Lukas Miedema, we went for a burger with a pint. After the food, we joined the team from Open Value for drinks.

Thursday
With a heavy head from the night before, we drove back to the conference hall for the last time this Devoxx. The first two days were great, therefore I had high expectations for our third day.
Backlog.md — Reaching 95 % Task success rate with AI Agents
Alex Gavrilescu
Before our workshop, I had a chat with Stephan Janssen about tooling. He pointed me to Backlog.md, an interesting tool to do specification‑driven development. I had some prior experience with a tool from AWS called Kiro. It was not the best experience. It felt more waterfall than iterative. Backlog.md is different; the basis is kanban, and it integrates with tools like OpenAI Codex through the AGENT.md file.
Working with tasks in Backlog is very intuitive; all files are stored as markdown files in your Git repository. Alex said that he had done some hallucination‑driven development. Codex kept calling a function that was not available; therefore, Alex decided to implement that function.
My next blog is entirely about using Codex and Backlog.md together. I am building a Connect Four game in the console without programming myself.
Beyond local tools: Deep dive into the Model Context Protocol (MCP)
James Ward / Maximilian Schellhorn
This was an excellent talk. All aspects of MCP are discussed, not just the tools. I learned about the generateOutputSchema annotation. I did not know that the output schema is not generated by default. Using resources to expose more information about the server was also new to me. I especially like the part about elicitations—the power to ask the caller of the MCP for more details by the MCP server. Another thing I did not know was Sampling. This mechanism allows the MCP server to utilise the LLM of the calling agent, thereby eliminating the need for it to have its own LLM.
In the final part of the presentation, the scalability of MCP is discussed. Of course, AWS is used as an example, but the concepts are also valid for other platforms. The gateway was used as an entry to the MCP servers, and AWS AgentCore was also mentioned for a generic runtime. This is a topic I’ll discuss in a later blog.
Passkeys, one-time tokens: passwordless Spring Security
Daniel Garnier‑Moiroux
A specialised part of Spring Security is authentication using one‑time passwords. The idea is that you go to a form and receive an email with a one‑time password or an SMS. You enter the one‑time password in an authentication form, or you click a link in the email. You often see this approach when a password is lost, although it’s not the same, but similar.
In the second part, Daniel discussed passkeys. You know, those Ubi keys, or your phase ID, or fingerprint. Spring Security also supports this in combination with webauth4j. It was an excellent presentation, one you should definitely watch.
Securing MCP Servers
Daniel Garnier‑Moiroux
After lunch, another talk from Daniel. This time, about MCP and security. The thing that stuck with me is the difference between OAuth Dynamic Client Registration (DCR) and static client registration. Up until now, I have used static registration, where the client must be known to the server upfront. The client knows the secret key and password to connect to the server.
The most significant advantage for DCR is the self‑service onboarding of clients. Another problem I want to address in a sample of mine is gaining access to the principal. Daniel pointed to a library on top of Spring Security for MCP Security that makes working with OAuth for MCP easier.
GitHub – spring‑ai‑community/mcp‑security
It was again a great talk and I will use some parts in the coming blogs.
Gen AI Grows Up: Enterprise JVM Agents With Embabel
Rod Johson
Another must‑see talk if you are thinking about running AI Agents on the JVM. The talk was a good summary of what I already know. But please have a look, it will be interesting, I promise.
Understanding Prompt Injection — Techniques, Challenges, and Advanced Escalation
Brian Vermeer
This talk is hard to summarise. Again, a must‑see talk if you are using an agent on your machine or you provide prompts to users in your applications. Some of the hacks were scary, and Brian shows you what can be done—a great talk.
That was it for 2025
That was Devoxx 2025 for me. Great to be able to start the conference by presenting our workshop with Daniël. And what an interesting set of talks I have seen. A lot of inspiration for more blogs. So stay tuned.
Want to know more about what we do?
We are your dedicated partner. Reach out to us.

