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.propertiesDefault (fallback)
messages_en.propertiesEnglish
messages_fr.propertiesFrench
messages_de.propertiesGerman
messages_es.propertiesSpanish

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.