Provides a mechanism for creating localizable error messages for presentation to the user. Uses ResourceBundles to provide the localization of the error message. Messages may contain one or more "replacement parameters ". Two replacement parameters are provided by default, they are the field name and field value, and are indices 0 and 1 respectively. To use replacement parameters a message must contain the replacement token {#} where # is the numeric index of the replacement parameter.
For example, to construct an error message with one additional replacement parameter which is the action the user was trying to perform, you might have a properties file entry like:
/action/MyAction.myErrorMessage={1} is not a valid {0} when trying to {2}
At runtime this might get replaced out to result in an error message for the user that looks like "Fixed is not a valid status when trying to create a new bug".
First looks for a resource with the action bean FQN prepended to the supplied message key. If If that cannot be found then looks with the action path as a prefix instead of the FQN. Failing that, the last attempt looks for a resource with the exact message key provided. This allows developers to segregate their error messages by action without having to repeat the action path in the ActionBean. For example a message constructed with {@code new LocalizableError("insufficientBalance")} might look for message resources withthe following keys:
- {@code com.myco.TransferActionBean.insufficientBalance}
- {@code /account/Transfer.action.insufficientBalance}
- {@code insufficientBalance}
One last point of interest is where the user friendly field name comes from. Firstly an attempt is made to look up the localized name in the applicable resource bundle using the String beanClassFQN.fieldName where beanClassFQN is the fully qualified name of the bean class, and fieldName is the name of the field on the form. The second attempt is made with String actionPath.fieldName where actionPath is the action of the form in the JSP (or equally, the path given in the @UrlBinding annotation in the ActionBean class). Finally, the last attempt uses fieldName by itself.
@see java.text.MessageFormat
@see java.util.ResourceBundle