| java.lang.Object org.springframework.context.support.AbstractMessageSource
All known Subclasses: org.springframework.context.support.StaticMessageSource, org.springframework.context.support.ResourceBundleMessageSource, org.springframework.context.support.ReloadableResourceBundleMessageSource,
AbstractMessageSource | abstract public class AbstractMessageSource implements HierarchicalMessageSource(Code) | | Abstract implementation of the HierarchicalMessageSource interface,
implementing common handling of message variants, making it easy
to implement a specific strategy for a concrete MessageSource.
Subclasses must implement the abstract resolveCode
method. For efficient resolution of messages without arguments, the
resolveCodeWithoutArguments method should be overridden
as well, resolving messages without a MessageFormat being involved.
Note: By default, message texts are only parsed through
MessageFormat if arguments have been passed in for the message. In case
of no arguments, message texts will be returned as-is. As a consequence,
you should only use MessageFormat escaping for messages with actual
arguments, and keep all other messages unescaped. If you prefer to
escape all messages, set the "alwaysUseMessageFormat" flag to "true".
Supports not only MessageSourceResolvables as primary messages
but also resolution of message arguments that are in turn
MessageSourceResolvables themselves.
This class does not implement caching of messages per code, thus
subclasses can dynamically change messages over time. Subclasses are
encouraged to cache their messages in a modification-aware fashion,
allowing for hot deployment of updated messages.
author: Juergen Hoeller author: Rod Johnson See Also: AbstractMessageSource.resolveCode(String,java.util.Locale) See Also: AbstractMessageSource.resolveCodeWithoutArguments(String,java.util.Locale) See Also: AbstractMessageSource.setAlwaysUseMessageFormat See Also: java.text.MessageFormat |
Field Summary | |
final protected Log | logger |
Method Summary | |
protected MessageFormat | createMessageFormat(String msg, Locale locale) Create a MessageFormat for the given message and Locale. | protected String | formatMessage(String msg, Object[] args, Locale locale) Format the given message String, using cached MessageFormats. | protected String | getDefaultMessage(String code) Return a fallback default message for the given code, if any.
Default is to return the code itself if "useCodeAsDefaultMessage"
is activated, or return no fallback else. | final public String | getMessage(String code, Object[] args, String defaultMessage, Locale locale) | final public String | getMessage(String code, Object[] args, Locale locale) | final public String | getMessage(MessageSourceResolvable resolvable, Locale locale) | protected String | getMessageFromParent(String code, Object[] args, Locale locale) Try to retrieve the given message from the parent MessageSource, if any. | protected String | getMessageInternal(String code, Object[] args, Locale locale) Resolve the given code and arguments as message in the given Locale,
returning null if not found. | public MessageSource | getParentMessageSource() | protected boolean | isAlwaysUseMessageFormat() Return whether to always apply the MessageFormat rules, parsing even
messages without arguments. | protected boolean | isUseCodeAsDefaultMessage() Return whether to use the message code as default message instead of
throwing a NoSuchMessageException. | protected String | renderDefaultMessage(String defaultMessage, Object[] args, Locale locale) Render the given default message String. | protected Object[] | resolveArguments(Object[] args, Locale locale) Search through the given array of objects, find any
MessageSourceResolvable objects and resolve them. | abstract protected MessageFormat | resolveCode(String code, Locale locale) Subclasses must implement this method to resolve a message. | protected String | resolveCodeWithoutArguments(String code, Locale locale) Subclasses can override this method to resolve a message without
arguments in an optimized fashion, that is, to resolve a message
without involving a MessageFormat.
The default implementation does use MessageFormat,
through delegating to the resolveCode method.
Subclasses are encouraged to replace this with optimized resolution.
Unfortunately, java.text.MessageFormat is not
implemented in an efficient fashion. | public void | setAlwaysUseMessageFormat(boolean alwaysUseMessageFormat) Set whether to always apply the MessageFormat rules, parsing even
messages without arguments.
Default is "false": Messages without arguments are by default
returned as-is, without parsing them through MessageFormat.
Set this to "true" to enforce MessageFormat for all messages,
expecting all message texts to be written with MessageFormat escaping.
For example, MessageFormat expects a single quote to be escaped
as "''". | public void | setParentMessageSource(MessageSource parent) | public void | setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage) Set whether to use the message code as default message instead of
throwing a NoSuchMessageException. |
logger | final protected Log logger(Code) | | Logger available to subclasses
|
createMessageFormat | protected MessageFormat createMessageFormat(String msg, Locale locale)(Code) | | Create a MessageFormat for the given message and Locale.
This implementation creates an empty MessageFormat first,
populating it with Locale and pattern afterwards, to stay
compatible with J2SE 1.3.
Parameters: msg - the message to create a MessageFormat for Parameters: locale - the Locale to create a MessageFormat for the MessageFormat instance |
formatMessage | protected String formatMessage(String msg, Object[] args, Locale locale)(Code) | | Format the given message String, using cached MessageFormats.
By default invoked for passed-in default messages, to resolve
any argument placeholders found in them.
Parameters: msg - the message to format Parameters: args - array of arguments that will be filled in for params withinthe message, or null if none. Parameters: locale - the Locale used for formatting the formatted message (with resolved arguments) |
getDefaultMessage | protected String getDefaultMessage(String code)(Code) | | Return a fallback default message for the given code, if any.
Default is to return the code itself if "useCodeAsDefaultMessage"
is activated, or return no fallback else. In case of no fallback,
the caller will usually receive a NoSuchMessageException from
getMessage .
Parameters: code - the message code that we couldn't resolveand that we didn't receive an explicit default message for the default message to use, or null if none See Also: AbstractMessageSource.setUseCodeAsDefaultMessage |
getMessageFromParent | protected String getMessageFromParent(String code, Object[] args, Locale locale)(Code) | | Try to retrieve the given message from the parent MessageSource, if any.
Parameters: code - the code to lookup up, such as 'calculator.noRateSet' Parameters: args - array of arguments that will be filled in for paramswithin the message Parameters: locale - the Locale in which to do the lookup the resolved message, or null if not found See Also: AbstractMessageSource.getParentMessageSource() |
getMessageInternal | protected String getMessageInternal(String code, Object[] args, Locale locale)(Code) | | Resolve the given code and arguments as message in the given Locale,
returning null if not found. Does not fall back to the code
as default message. Invoked by getMessage methods.
Parameters: code - the code to lookup up, such as 'calculator.noRateSet' Parameters: args - array of arguments that will be filled in for paramswithin the message Parameters: locale - the Locale in which to do the lookup the resolved message, or null if not found See Also: AbstractMessageSource.getMessage(String,Object[],String,Locale) See Also: AbstractMessageSource.getMessage(String,Object[],Locale) See Also: AbstractMessageSource.getMessage(MessageSourceResolvable,Locale) See Also: AbstractMessageSource.setUseCodeAsDefaultMessage |
isAlwaysUseMessageFormat | protected boolean isAlwaysUseMessageFormat()(Code) | | Return whether to always apply the MessageFormat rules, parsing even
messages without arguments.
|
isUseCodeAsDefaultMessage | protected boolean isUseCodeAsDefaultMessage()(Code) | | Return whether to use the message code as default message instead of
throwing a NoSuchMessageException. Useful for development and debugging.
Default is "false".
Alternatively, consider overriding the getDefaultMessage
method to return a custom fallback message for an unresolvable code.
See Also: AbstractMessageSource.getDefaultMessage(String) |
renderDefaultMessage | protected String renderDefaultMessage(String defaultMessage, Object[] args, Locale locale)(Code) | | Render the given default message String. The default message is
passed in as specified by the caller and can be rendered into
a fully formatted default message shown to the user.
Default implementation passes the String to formatMessage ,
resolving any argument placeholders found in them. Subclasses may override
this method to plug in custom processing of default messages.
Parameters: defaultMessage - the passed-in default message String Parameters: args - array of arguments that will be filled in for params withinthe message, or null if none. Parameters: locale - the Locale used for formatting the rendered default message (with resolved arguments) See Also: AbstractMessageSource.formatMessage(String,Object[],java.util.Locale) |
resolveArguments | protected Object[] resolveArguments(Object[] args, Locale locale)(Code) | | Search through the given array of objects, find any
MessageSourceResolvable objects and resolve them.
Allows for messages to have MessageSourceResolvables as arguments.
Parameters: args - array of arguments for a message Parameters: locale - the locale to resolve through an array of arguments with any MessageSourceResolvables resolved |
resolveCode | abstract protected MessageFormat resolveCode(String code, Locale locale)(Code) | | Subclasses must implement this method to resolve a message.
Returns a MessageFormat instance rather than a message String,
to allow for appropriate caching of MessageFormats in subclasses.
Subclasses are encouraged to provide optimized resolution
for messages without arguments, not involving MessageFormat.
See resolveCodeWithoutArguments javadoc for details.
Parameters: code - the code of the message to resolve Parameters: locale - the Locale to resolve the code for(subclasses are encouraged to support internationalization) the MessageFormat for the message, or null if not found See Also: AbstractMessageSource.resolveCodeWithoutArguments(String,java.util.Locale) |
resolveCodeWithoutArguments | protected String resolveCodeWithoutArguments(String code, Locale locale)(Code) | | Subclasses can override this method to resolve a message without
arguments in an optimized fashion, that is, to resolve a message
without involving a MessageFormat.
The default implementation does use MessageFormat,
through delegating to the resolveCode method.
Subclasses are encouraged to replace this with optimized resolution.
Unfortunately, java.text.MessageFormat is not
implemented in an efficient fashion. In particular, it does not
detect that a message pattern doesn't contain argument placeholders
in the first place. Therefore, it's advisable to circumvent
MessageFormat completely for messages without arguments.
Parameters: code - the code of the message to resolve Parameters: locale - the Locale to resolve the code for(subclasses are encouraged to support internationalization) the message String, or null if not found See Also: AbstractMessageSource.resolveCode See Also: java.text.MessageFormat |
setAlwaysUseMessageFormat | public void setAlwaysUseMessageFormat(boolean alwaysUseMessageFormat)(Code) | | Set whether to always apply the MessageFormat rules, parsing even
messages without arguments.
Default is "false": Messages without arguments are by default
returned as-is, without parsing them through MessageFormat.
Set this to "true" to enforce MessageFormat for all messages,
expecting all message texts to be written with MessageFormat escaping.
For example, MessageFormat expects a single quote to be escaped
as "''". If your message texts are all written with such escaping,
even when not defining argument placeholders, you need to set this
flag to "true". Else, only message texts with actual arguments
are supposed to be written with MessageFormat escaping.
See Also: java.text.MessageFormat |
setUseCodeAsDefaultMessage | public void setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage)(Code) | | Set whether to use the message code as default message instead of
throwing a NoSuchMessageException. Useful for development and debugging.
Default is "false".
Note: In case of a MessageSourceResolvable with multiple codes
(like a FieldError) and a MessageSource that has a parent MessageSource,
do not activate "useCodeAsDefaultMessage" in the parent:
Else, you'll get the first code returned as message by the parent,
without attempts to check further codes.
To be able to work with "useCodeAsDefaultMessage" turned on in the parent,
AbstractMessageSource and AbstractApplicationContext contain special checks
to delegate to the internal getMessageInternal method if available.
In general, it is recommended to just use "useCodeAsDefaultMessage" during
development and not rely on it in production in the first place, though.
See Also: AbstractMessageSource.getMessage(String,Object[],Locale) See Also: AbstractMessageSource.getMessageInternal See Also: org.springframework.validation.FieldError |
|
|