Java · Spring · Thymeleaf · Htmx
Production-ready Spring Boot, crafted carefully.
I'm Wim Deblauwe, a software developer specialized in Java and Spring. I write books, maintain open-source projects like error-handling-spring-boot-starter, and publish practical, battle-tested articles here.
just start typing — try thymeleaf, testcontainers or htmx
Taming Thymeleaf
Server-side rendering with Spring Boot, step by step.
Modern frontends with htmx
Hypermedia-driven UIs with Spring Boot & Thymeleaf.
Recent posts
showing 10 of 124- Apr 1, 2016 AssertJ custom assertion for testing ConstraintValidator implementations If you want to unit test a ConstraintValidator with AssertJ, then you can use this custom validator to make the tests more readable: import org.assertj.core.api.AbstractAssert; import javax.validation.ConstraintViolation; import java.util.Set; import java.util.stream.Collectors; public class ConstraintViolationSetAssert extends AbstractAssert<ConstraintViolationSetAssert, Set<? extends ConstraintViolation>> { public ConstraintViolationSetAssert(Set<? extends ConstraintViolation> actual) { super(actual, ConstraintViolationSetAssert.class); } public static ConstraintViolationSetAssert assertThat(Set<? extends ConstraintViolation> actual) { return new ConstraintViolationSetAssert(actual); } public ConstraintViolationSetAssert hasViolationOnPath(String path) { isNotNull(); // check condition if (!containsViolationWithPath(actual, path)) { failWithMessage("There was no violation with path <%s>. Violation paths: <%s>", path, actual.stream() .map(violation -> violation .getPropertyPath() .toString()) .collect( Collectors .toList())); } return this; } private boolean containsViolationWithPath(Set<? extends ConstraintViolation> violations, String path) { boolean result = false; for (ConstraintViolation violation : violations) { if (violation.getPropertyPath().toString().equals(path)) { result = true; break; } } return result; } }
- Sep 30, 2015 Read only EntryProcessors with Hazelcast This post is a follow-up on my post EntryProcessors and EntryBackupProcessors with Hazelcast. In the comments, Peter Veentjer from Hazelcast gave me the idea to use an EntryProcessor to read part of the data. I will show you below how to best do this. We start with a cache that has 10 User objects in it and we want to retrieve the user names of all users in the cache. Without an entry processor We can get the list of names without using an entry processor. For example:
- Sep 29, 2015 EntryProcessors and EntryBackupProcessors with Hazelcast Hazelcast has the concept of EntryProcessors (like Oracle Coherence). EntryProcessors allow to update cache entries without having to pull over the actual values. You move the processing to where the value lives and update the cache there. Furthermore, Hazelcast has the notion of EntryBackupProcessor (which Coherence does not have). To explain the usage of this, we will use a simple User class: class User implements Serializable { private long id; private String name; private DateTime lastLoginTime; // getters and setters omitted }
- Mar 24, 2015 Introduction to using JavaFX with afterburner.fx I wanted to try out afterburner.fx, a JavaFX framework which describes itself as: a minimalistic (3 classes) JavaFX MVP framework based on Convention over Configuration and Dependency Injection. For this purpose I created a simple note taking application which looks like this when finished: First off, the domain class that represents a Note: public class Note { private long id; private String title; private String content; // Getter and setters ommitted
- Mar 13, 2015 Using Font Awesome in JavaFX with fontawesomefx Icons are a great way to spice up any UI. You can easily use the Font Awesome icons in JavaFX, by using the fontawesomefx library. I will show a small example on how to use the icons in JavaFX code and how to apply some styling. First import the library. I am using Maven, so I just add this dependency: <dependency> <groupId>de.jensd</groupId> <artifactId>fontawesomefx</artifactId> <version>8.2</version> </dependency> We will start with a simple app that uses a BorderPane to put some content at the center and have a kind of header at the top:
- Nov 4, 2014 Spring Boot application with exploded directory structure Spring Boot is really amazing for getting started quickly with a new Spring application. By default, your application is contained in a single jar when packaging it. This has some advantages, but what if you want a "classic" layout with a config folder (for your application.properties or logback.xml files) and a lib folder? Getting Started This blog post will show you a way of doing this using Maven and the Maven Assembly Plugin.
- Jul 16, 2014 Opening multiple SSH sessions with iTerm automatically iTerm is great, but if you are working with a cluster of servers, it quickly becomes tedious to open an SSH session to each server and to configure splits so you can talk to all servers at once. Based upon the scripts here (but does not use splits) and here (but does not work with 7 servers which I needed in my case), I came up with the following AppleScript that works for me.
- Jun 11, 2014 Using Cassandra unit with TestNG I just started some tests with Cassandra and Spring Data Cassandra. I want to write some unit tests for this using TestNG. The Cassandra Unit project uses JUnit by default, but can be used with TestNG as well with some tweaking. To start, add the following dependencies in your Maven pom: <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-cassandra</artifactId> <version>1.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.apache.cassandra</groupId> <artifactId>cassandra-all</artifactId> <version>2.0.5</version> </dependency> <dependency> <groupId>org.cassandraunit</groupId> <artifactId>cassandra-unit</artifactId> <version>2.0.2.1</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>cassandra-all</artifactId> <groupId>org.apache.cassandra</groupId> </exclusion> <exclusion> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.cassandraunit</groupId> <artifactId>cassandra-unit-spring</artifactId> <version>2.0.2.1</version> <scope>test</scope> </dependency>
- May 24, 2014 Release JIRA Database Values plugin 3.3 Just a quick note that I released version 3.3 of my JIRA database values plugin. It has only 1 bugfix: https://bitbucket.org/wimdeblauwe/jdvp/issue/14/ajax-style-field-dont-run-in-popup-screen but an important one given the 5 votes it got. Note that I cannot take any credit for the fix, user Mirek Hankus provide it. Thanks for it!
- Mar 20, 2014 Switching easily between Java JDKs on Mac OS X I just came upon a neat little trick to easily switch what JDK you are using on the command line on Mac OS X (10.9.2 is the version I am using), courtesy of this AskDifferent answer. First, add the following aliases in ~/.profile file: alias setJdk6='export JAVA_HOME=$(/usr/libexec/java_home -v 1.6)' alias setJdk7='export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)' alias setJdk8='export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)' Open a new terminal window or use source ~/.profile to load the aliases.
no matches for "" — browse the full archive →