23 — Advanced
Message Resolution
The MessageResolver loads messages from Java ResourceBundle files (.properties) and supports locale-aware message lookup. This is essential for internationalized validation error messages and user-facing text.
Properties File
Define your messages in a standard Java properties file (e.g., messages.properties):
# messages.properties
error.name.required=Name is required
error.email.invalid=Email address is invalid
error.age.minimum=Age must be at least {0}
warning.deprecated=This feature is deprecated
Creating a MessageResolver
// Create a resolver from a resource bundle
MessageResolver resolver = MessageResolver.builder("messages").build();
// Look up a message
String msg = resolver.resolve(Locale.getDefault(), "error.name.required");
// "Name is required"
// With a default fallback
String msg2 = resolver.resolve(Locale.getDefault(), "unknown.key", "Default text");
// "Default text"
Multiple Bundles
You can register multiple resource bundles. The resolver searches them in order until it finds a match:
MessageResolver resolver = MessageResolver.builder(
"messages", "validation_messages").build();
// Searches both bundles in order
Integration with RuleContext
Wire your message resolver into the RuleContext so validation rules can automatically resolve messages:
RuleContext ctx = RuleContext.builder()
.messageResolver("messages")
.build(bindings);
Locale Support
Java ResourceBundles support locale-specific files using the standard naming convention. The resolver will automatically pick the correct file based on the active locale:
| File | Locale |
|---|---|
| messages.properties | Default (fallback) |
| messages_en.properties | English |
| messages_fr.properties | French |
| messages_de.properties | German |
| messages_es.properties | Spanish |
Use Case
Message resolution is primarily used for internationalized validation error messages. By externalizing messages into properties files, you can support multiple languages without changing your rule logic, and maintain a single source of truth for all user-facing text.