spring-projects/spring-ai · warning

Failed to decode Base64 data, storing as string

Error message

Failed to decode Base64 data, storing as string

What it means

When reconstructing Media from stored JSON, if dataType is "base64" the repository decodes the data string with Base64.getDecoder(); on IllegalArgumentException it logs this warning and stores the raw string as the media data instead of the decoded bytes. The message/media is still built, but downstream code expecting byte[] may misbehave.

Source

Thrown at memory-repositories/spring-ai-model-chat-memory-repository-redis/src/main/java/org/springframework/ai/chat/memory/repository/redis/RedisChatMemoryRepository.java:967

					mediaList.add(mediaBuilder.build());
				}
			}
		}
		return mediaList;
	}

	private void parseMediaData(JsonObject mediaJson, Media.Builder mediaBuilder) {
		JsonElement dataElement = mediaJson.get("data");
		if (dataElement.isJsonPrimitive() && dataElement.getAsJsonPrimitive().isString()) {
			String dataString = dataElement.getAsString();

			if (mediaJson.has("dataType") && "base64".equals(mediaJson.get("dataType").getAsString())) {
				try {
					byte[] decodedBytes = Base64.getDecoder().decode(dataString);
					mediaBuilder.data(decodedBytes);
				}
				catch (IllegalArgumentException e) {
					logger.warn("Failed to decode Base64 data, storing as string", e);
					mediaBuilder.data(dataString);
				}
			}
			else {
				try {
					mediaBuilder.data(URI.create(dataString));
				}
				catch (IllegalArgumentException e) {
					mediaBuilder.data(dataString);
				}
			}
		}
		else if (dataElement.isJsonArray()) {
			JsonArray dataArray = dataElement.getAsJsonArray();
			byte[] byteArray = new byte[dataArray.size()];
			for (int i = 0; i < dataArray.size(); i++) {
				byteArray[i] = dataArray.get(i).getAsByte();
			}

View on GitHub (pinned to 98a7beda4f)

Solutions

  1. Inspect the stored media JSON and verify the data really is valid Base64
  2. If the writer used MIME/URL-safe Base64, re-encode it with the basic encoder or adjust dataType accordingly
  3. Re-store the media with the original byte[] so Spring AI encodes it itself
  4. Fix the dataType field (e.g. set it to a URI type) if the string is actually a URL, not base64
  5. Handle the resulting Media defensively — its data may be a String, not byte[]

Example fix

// before
{"dataType":"base64","data":"not valid base64!!"}
// after
String fixed = Base64.getEncoder().encodeToString(rawBytes);
{"dataType":"base64","data":"<validBase64>"}
Defensive patterns

Strategy: validation

Validate before calling

boolean isBase64(String s) {
    return s != null && !s.isEmpty() && s.matches("^[A-Za-z0-9+/]+={0,2}$") && s.length() % 4 == 0;
}
// run before marking dataType=base64 when persisting media

Type guard

static boolean isValidBase64(String s) {
    if (s == null || s.isEmpty()) return false;
    try { java.util.Base64.getDecoder().decode(s); return true; } catch (IllegalArgumentException e) { return false; }
}

Try / catch

try { byte[] data = Base64.getDecoder().decode(mediaData); }
catch (IllegalArgumentException e) {
    // data may actually be MIME/URL-safe base64 or a URI string — inspect and repair, don't blind-store
    throw new IllegalStateException("Stored media marked base64 but not decodable", e);
}

Prevention

When it happens

Trigger: A stored media entry whose dataString is declared base64 but is not valid Base64 (truncated, contains whitespace/URL characters, written by a different encoder variant such as MIME or URL-safe Base64).

Common situations: Data written with Base64.getMimeDecoder() or getUrlDecoder() then read here with the basic decoder; manually pasted/edited Redis data; truncated payloads from an earlier failed write; strings that are actually URIs mis-tagged as base64.

Understand the failure class

Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.

Related errors


AI-assisted analysis of spring-projects/spring-ai@98a7beda4f (2026-09-11). Data as JSON: /api/errors/b672b24a2809ebf3. Report an issue: GitHub.