Joris Kuipers

Joris Kuipers

@joris.kuipe.rs

CTO & hands-on architect at Trifork Amsterdam. 40 over 40

321 followers187 following215 posts

Wondering why @micrometer.io doesn't back-port super useful yet trivial (i.e. safe) changes to their release branch, like sending the @datadoghq.com API key in a header instead of query param and using Gzip compression to send the metrics. 1.17.2 was just released, but this all remains unreleased 😢

TIL that by default, Apache HTTP clients will retry on a 429 and 503 response while respecting the Retry-After header. Then a PHP site that's down b/o the CVEs started to respond with that header set to 3600, and the client happily obliges... 🤦‍♂️ HttpClients.custom().disableAutomaticRetries() FTW

Joris Kuipers reposted

I see we're having a debate about whether it's okay to go back to "X," the site owned by a trillionaire fascist who is currently bankrolling the GOP's midterm, throttled Ukraine's war effort, and still winkingly allows vast amounts of CSAM on his service Answer: No, what the fuck is wrong with you

In general I've found that working with Gradle becomes a lot more pleasant (or, depending on your stance, bearable) with modern models to support it: I did a lot of restructuring with Opus already recently that I simply wouldn't have bothered with on my own. Esp. lazy configuration is a tricky topic

TIL that Spring's RestClient does not automatically add an Accept header to its requests like RestTemplate does. We have migrated a lot of clients already, but only now encountered the first backend that compained about a missing Accept header.

In the process of migrating a huge monorepo using 1000s of lines of code with Spring's RestTemplate to use RestClient. It's an easy mistake to leave an existing HttpEntity that was passed as the request to the template and now pass it to the RestClient's body() method: still compiles, but wrong.

To avoid this from happening, Claude/Opus just wrote a nice javac plugin for me that recognizes this situation and turns it into a compile-time error. Very cool: I had the general idea, but going from there to working impl just took minutes now, while it would've taken me at least half a day.

JFC, working with GraalVM is worse than getting your OSGi bundles to run with Spring 15 years ago: java.lang.IllegalArgumentException: Invalid logger interface org.hibernate.validator.internal.util.logging.Log (implementation not found) Supposedly fixed, but not for me: github.com/oracle/graal...

github.comCaused by: java.lang.IllegalArgumentException: Invalid logger interface org.hibernate.validator.internal.util.logging.Log (implementation not found in jdk.internal.loader.ClassLoaders$AppClassLoader@2...Hi, I am having an issue mentioned below while running the artifact using nativeRun. (nativeCompile worked properly) Caused by: java.lang.IllegalArgumentException: Invalid logger interface org.hibe...
Joris Kuipers@joris.kuipe.rs

I would've thought GraalVM native compilation was unreliable enough as it is with all these OSS libraries needing 3rd party metadata, but apparently Oracle drops that data I contributed in new releases as well 😢 WHY, ORACLE, WHY???!!!! github.com/oracle/graal... Map$Entry[] is there though, WTF...

AI might kill us all, but let’s see if it can debug why my GraalVM build stopped working with Thymeleaf after updating from Boot 3.5 to 4.1.1 and then let’s see what I need to worry about first.

Hah, Claude fixed it by reverting my old commit that registered standard Java types. I filed an issue against the Oracle reachability-metadata repo to have those added: github.com/oracle/graal... However, newer versions have dropped several entries, including java.util.Map$Entry which was failing.

github.comgraalvm-reachability-metadata/metadata/org.thymeleaf/thymeleaf/3.1.0.RELEASE/reachability-metadata.json at master · oracle/graalvm-reachability-metadataRepository which contains community-driven collection of GraalVM reachability metadata for open-source libraries. - oracle/graalvm-reachability-metadata

I would've thought GraalVM native compilation was unreliable enough as it is with all these OSS libraries needing 3rd party metadata, but apparently Oracle drops that data I contributed in new releases as well 😢 WHY, ORACLE, WHY???!!!! github.com/oracle/graal... Map$Entry[] is there though, WTF...

github.comgraalvm-reachability-metadata/metadata/org.thymeleaf/thymeleaf/3.1.5.RELEASE/reachability-metadata.json at master · oracle/graalvm-reachability-metadataRepository which contains community-driven collection of GraalVM reachability metadata for open-source libraries. - oracle/graalvm-reachability-metadata

My presentation from this year’s Spring I/O conference is up on YouTube: if you’re using point-to-point messaging, make sure to check it out for some production-hardened ideas on how to handle dead-lettered messages for your applications and platforms! 📨🍃

Spring I/O@springio.net

🍃 Fallout: Dead Letter Management At Scale by Joris Kuipers @ Spring I/O 2026 ▶️ Video: youtu.be/UFIFvqTFa3A 🔗 Slides: 2026.springio.net/slides/fallo... #springio26

So far just some minor issues to fix: some of our code relying on poor defaults in Jackson 2 (collection properties without setters, unmarshalling missing fields to primitive types) and missing that our auto-config referenced Boot config classes by name whose package has changed. Almost stable! 💪🍃

No one doing this already? Is using virtual threads in production really pioneering?

Joris Kuipers@joris.kuipe.rs

Planning to use virtual threads with Spring Boot. Means server.tomcat.max-threads will be ignored and server.tomcat.max-connections will effectively determine concurrency, but that's for capping open connections, not actively handled requests. Should I add a semaphore to control concurrency myself?

Joris Kuipers reposted

It was really exciting to officially introduce Arconia at Spring I/O last month. Open-source extension improving the developer experience on Spring Boot. I talked about dev services, observability, automated migrations, agent skills, and a sneak peek at the upcoming dev UI. @arconia.io

Spring I/O@springio.net

🍃 Arconia for Spring Boot: Dev Services, Automated Migrations, and Seamless Workflows by @thomasvitale.com @ Spring I/O 2026 ▶️ Video: youtu.be/UYBFbBfgYoE 🔗 Slides: speakerdeck.com/thomasvitale... #springio26

Planning to use virtual threads with Spring Boot. Means server.tomcat.max-threads will be ignored and server.tomcat.max-connections will effectively determine concurrency, but that's for capping open connections, not actively handled requests. Should I add a semaphore to control concurrency myself?

Just silently broke my Logback-based logging when updating a GraalVM natively compiled Spring Boot app from 3.5.8 to 3.5.14. Goes to show that this is still really tricky to use and not really ready for mass enterprise adoption, as far as I'm concerned.

View full thread

Sanity restored, but as I mentioned already: if minor upgrades can make arbitrary dependencies fail silently and you have to detect and fix this yourself for 3rd party components, how can you expect mass adoption?

Just silently broke my Logback-based logging when updating a GraalVM natively compiled Spring Boot app from 3.5.8 to 3.5.14. Goes to show that this is still really tricky to use and not really ready for mass enterprise adoption, as far as I'm concerned.

Looks like multiple issues. An <include> started failing silently, even after adding a resource hint, but after "fixing" that by inlining the resource I still get this new warning: |-WARN in ch.qos.logback.classic.LoggerContext[default] - Versions of logback-classic and ? are different or unknown.

Joris Kuipers reposted

Want fewer freezes and bugs in your IntelliJ IDEA? Help us — enable automatic error reporting: Appearance & Behavior → System Settings → Data Sharing → Send error reports automatically Every report helps prioritize fixes. Takes 10 seconds, makes a real difference! #ide #java

Leaving Barcelona after another great @springio.net edition. Glad that I could speak again, very happy to have reconnected with so many people and hope to be at #springio27 that will take place in Valencia! 😎 Thanks to @sergialmar.com and everyone else who made this happen 🙏 #springio26

Google Maps combined with Barcelona public transport really makes it easy to get around. Hadn’t used Maps for this much yet, but have to admit that I’m impressed with the experience #springio26