There are a lot of how-tos on how to use OpenAPI to document the REST APIs of a Quarkus microservice.
However, none of them show you how to document the schema of your API response.
In this blog post I’ll show you two ways to add schema documentation to your OpenAPI spec.
Continue reading →
In this blog post, I want to clear up some fuzziness that seems to surround Reactive Streams.
It is all too easy to defeat the goals that can be achieved with Reactive Streams, especially where the application is part of an environment with both synchronous and asynchronous inputs and outputs.
Continue reading →
We’ll look at some examples of different kinds of exceptions and how we can deal with them in ZIO.
Continue reading →
Pattern matching got quite an update in Java 19 (although it does require turning on experimental features).
Continue reading →
The slurp
funtion in Clojure can be used to read the contents of a file and return it as a string value. We can use several types as argument for the function. For example a string argument is used as URI and if that is not valid as a file name of the file to read. A File
instance can be used directly as argument as well. But also Reader
, BufferedReader
, InputStream
, URI
, URL
, Socket
, byte[]
and char[]
. As an option we can specify the encoding used to read the file content using the :encoding
keyword. The default encoding is UTF-8 if we don’t specify the encoding option.
Continue reading →
I use a local Kubernetes cluster to help me develop microservices.
On my 2015 Macbook Pro, the cluster ran inside a Minikube VM using the Hyperkit driver.
Replicating this setup on my new 2021 Macbook Pro proved impractical.
This is how I made it work.
Continue reading →
A tool that helps with scanning for security vulnerabilities in dependencies can be a great addition to a CI/CD stack.
Using it poorly can leave you with a false sense of security.
Continue reading →
DataWeave has some very nice features to transform data objects. One of those nice features is the update
operator. With the update
operator we can change values of keys in an object using a very concise syntax. We don’t have to go through all keys and create a new object, but we can pinpoint the exact key and change the value. To get the correct key we use selectors. Once we have the key we can set a new value. We can define a variable to contain the current value if we want to use it to define a new value. Also is it possible to add a condition that needs to be true to change the value. Finally the update
operator supports upserting a value if the key might not exist yet.
Continue reading →
Because everyone should use Hexagonal architecture… except when they shouldn’t.
Continue reading →
One of the great features of Kotlin is its interoperability with Java code. This allows you to easily call
'traditional' Java code from your Kotlin code, but it also helps you the other way around:
calling Kotlin code from Java.
Sometimes, a little extra work is needed to make some shiny Kotlin feature work with Java code. For example,
Kotlin supports default parameter values, which are not supported in Java. In this case, the @JvmOverloads
annotation
can be used to generate overloads for functions that contain parameters with default values.
This annotation does not only work on functions, but can also be applied on constructors. In this post I will explain how
to use this feature on the primary constructor, as it might be confusing where to place the annotation.
Continue reading →