java 19 lines · 5 steps

Building URIs safely with UriComponentsBuilder in Spring

How Spring's fluent builder assembles an encoded search URL from query, paging, and optional parameters.

Explained by highlit
1public URI buildSearchUri(String query, int page, int size, List<String> tags) {
2 UriComponentsBuilder builder = UriComponentsBuilder
3 .fromUriString("https://api.example.com")
4 .path("/v2/products/search")
5 .queryParam("q", query)
6 .queryParam("page", page)
7 .queryParam("size", size)
8 .queryParam("sort", "relevance,desc");
9 
10 if (tags != null && !tags.isEmpty()) {
11 builder.queryParam("tag", tags.toArray());
12 }
13 
14 return builder
15 .queryParamIfPresent("currency", Optional.ofNullable(defaultCurrency))
16 .encode(StandardCharsets.UTF_8)
17 .build()
18 .toUri();
19}
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1A fluent builder lets you compose a URL declaratively instead of concatenating fragile strings.
  2. 2Encoding once at build time via encode() prevents malformed URLs from unescaped user input.
  3. 3queryParamIfPresent and Optional express conditional parameters without scattering null checks.

Related explainers

java
@Component
@Converter
public class EncryptedStringConverter implements AttributeConverter<String, String> {
 

Transparent column encryption in Spring & JPA

encryption aes-gcm jpa-converter
Advanced 10 steps
java
package com.acme.billing.config;
 
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;

Feature-flagged beans with Spring @ConditionalOnProperty

feature-flags conditional-beans strategy-pattern
Intermediate 5 steps
java
public static Map<String, String> parseCookieHeader(String header) {
    Map<String, String> cookies = new LinkedHashMap<>();
    if (header == null || header.isBlank()) {
        return cookies;

Parsing an HTTP Cookie header in Java

string-parsing http url-decoding
Intermediate 6 steps
java
public class TimedSocketReader {
 
    private static final int READ_TIMEOUT_MS = 5_000;
    private static final int CONNECT_TIMEOUT_MS = 3_000;

Reading a socket with connect and read timeouts

sockets timeouts io
Intermediate 8 steps
java
public final class EncodingDetector {
 
    public enum Encoding {
        UTF_8, UTF_16LE, UTF_16BE, UTF_32LE, UTF_32BE, ASCII, UNKNOWN

Detecting text encoding from raw bytes in Java

byte-manipulation encoding-detection bitwise-operations
Intermediate 8 steps
java
public final class ImportOrganizer {
 
    private static final Pattern IMPORT_LINE =
            Pattern.compile("^import\\s+(static\\s+)?([\\w.]+(?:\\.\\*)?)\\s*;\\s*$");

Sorting Java imports with a regex pass

regex sorting text-processing
Intermediate 8 steps

Share this explainer

Here's the card — post it anywhere.

Building URIs safely with UriComponentsBuilder in Spring — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code