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
‹ swipe to step through ›
Walkthrough
Space play
←→ step
click any line
Three takeaways
- 1A fluent builder lets you compose a URL declaratively instead of concatenating fragile strings.
- 2Encoding once at build time via encode() prevents malformed URLs from unescaped user input.
- 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.
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code
Embed this explainer
Drop the interactive walkthrough into a blog or docs. Views never cost a credit.
<iframe src="https://highlit.co/explainers/building-uris-safely-with-uricomponentsbuilder-in-spring-explained-java-6e9b/embed?autoplay=1" width="100%" height="520" loading="lazy" style="border:0"></iframe>
Autoplay is on by default — add ?autoplay=0 to start paused.