🔴 The Error You're Seeing

Confirm this matches your console output. If it does, you're in the right place.

ERROR LOGorg.springframework.context.NoSuchMessageException: No message found under code 'user.email.invalid' for locale 'en_US'. at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:161) at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1344)

⚡ Quick Fix Works 80% of the time

Add the missing key (e.g., user.email.invalid=Invalid email) to your messages.properties file.

# src/main/resources/messages.properties user.email.invalid=Invalid email format

🧠 Why this Happens

Tap to expand the deep technical explanation

You used `MessageSource.getMessage("user.email.invalid", ...)` or a Bean Validation annotation with a message code. Spring looked inside your `messages.properties` file for that key, but couldn't find it for the requested locale (or the default fallback).

The HITEC City Parking Spot Analogy:

A tourist asking a librarian for a book in Spanish, but the library only has the English copy. The librarian says 'No such book' instead of falling back to the English version.

🔁 How to Reproduce Confirm this is your error

Create a Spring Boot app. Call `messageSource.getMessage("nonexistent.code", null, Locale.US)`. Do not add the key to `messages.properties`.

🛠️ Solutions (5 Ways to Fix)

Solution 1✓ Most common cause

Add the missing key to messages.properties

👉 Use this when the key is simply missing.

Create a `src/main/resources/messages.properties` file and add the exact key Spring is looking for.

# messages.properties user.email.invalid=Invalid email format
Solution 2

Configure the MessageSource basename

👉 Use this if your properties file is named differently.

By default, Spring looks for `messages.properties`. If you named it `i18n/messages.properties`, you must tell Spring.

# application.properties spring.messages.basename=i18n/messages
Solution 3

Provide a fallback string in getMessage()

👉 Use this to prevent crashes if the key might be missing.

Pass a default String as the third argument. If the key isn't found, Spring returns this string instead of throwing an exception.

String msg = messageSource.getMessage("user.email.invalid", null, "Default error message", locale);
Solution 4

Set fallbackToSystemLocale=false

👉 Use this if the system locale is causing issues.

If the system locale doesn't have a properties file, Spring falls back to the system locale. Setting this to false forces it to use the default `messages.properties`.

# application.properties spring.messages.fallback-to-system-locale=false
Solution 5

Use useCodeAsDefaultMessage=true

👉 Use this during development to see exactly which codes are missing.

If the key is missing, Spring returns the code itself as the message, preventing the exception but making the UI ugly.

# application.properties spring.messages.use-code-as-default-message=true

📋 Version Notes

Spring Boot 2.x

Standard MessageSource auto-configuration.

Spring Boot 3.x

Stricter encoding handling, defaults to UTF-8.

🛡️ How to Prevent This Next Time

Centralize all validation codes and use IDE plugins (like Resource Bundle Manager) to highlight missing properties across locales.