Class AbstractMessageSource
- All Implemented Interfaces:
- HierarchicalMessageSource,- MessageSource
- Direct Known Subclasses:
- AbstractResourceBasedMessageSource,- StaticMessageSource
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(java.lang.String, java.util.Locale)
 method. For efficient resolution of messages without arguments, the
 resolveCodeWithoutArguments(java.lang.String, java.util.Locale) 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, Rod Johnson
- See Also:
- 
Field SummaryFields inherited from class org.springframework.context.support.MessageSourceSupportlogger
- 
Constructor SummaryConstructors
- 
Method SummaryModifier and TypeMethodDescriptionprotected PropertiesReturn a Properties object defining locale-independent common messages, if any.protected StringgetDefaultMessage(String code) Return a fallback default message for the given code, if any.protected StringgetDefaultMessage(MessageSourceResolvable resolvable, Locale locale) Get a default message for the givenMessageSourceResolvable.final StringgetMessage(String code, Object[] args, String defaultMessage, Locale locale) Try to resolve the message.final StringgetMessage(String code, Object[] args, Locale locale) Try to resolve the message.final StringgetMessage(MessageSourceResolvable resolvable, Locale locale) Try to resolve the message using all the attributes contained within theMessageSourceResolvableargument that was passed in.protected StringgetMessageFromParent(String code, Object[] args, Locale locale) Try to retrieve the given message from the parentMessageSource, if any.protected StringgetMessageInternal(String code, Object[] args, Locale locale) Resolve the given code and arguments as message in the given Locale, returningnullif not found.Return the parent of this MessageSource, ornullif none.protected booleanReturn whether to use the message code as default message instead of throwing a NoSuchMessageException.protected Object[]resolveArguments(Object[] args, Locale locale) Searches through the given array of objects, finds any MessageSourceResolvable objects and resolves them.protected abstract MessageFormatresolveCode(String code, Locale locale) Subclasses must implement this method to resolve a message.protected StringresolveCodeWithoutArguments(String code, Locale locale) Subclasses can override this method to resolve a message without arguments in an optimized fashion, i.e.voidsetCommonMessages(Properties commonMessages) Specify locale-independent common messages, with the message code as key and the full message String (may contain argument placeholders) as value.voidsetParentMessageSource(MessageSource parent) Set the parent that will be used to try to resolve messages that this object can't resolve.voidsetUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage) Set whether to use the message code as default message instead of throwing a NoSuchMessageException.Methods inherited from class org.springframework.context.support.MessageSourceSupportcreateMessageFormat, formatMessage, isAlwaysUseMessageFormat, renderDefaultMessage, setAlwaysUseMessageFormat
- 
Constructor Details- 
AbstractMessageSourcepublic AbstractMessageSource()
 
- 
- 
Method Details- 
setParentMessageSourceDescription copied from interface:HierarchicalMessageSourceSet the parent that will be used to try to resolve messages that this object can't resolve.- Specified by:
- setParentMessageSourcein interface- HierarchicalMessageSource
- Parameters:
- parent- the parent MessageSource that will be used to resolve messages that this object can't resolve. May be- null, in which case no further resolution is possible.
 
- 
getParentMessageSourceDescription copied from interface:HierarchicalMessageSourceReturn the parent of this MessageSource, ornullif none.- Specified by:
- getParentMessageSourcein interface- HierarchicalMessageSource
 
- 
setCommonMessagesSpecify locale-independent common messages, with the message code as key and the full message String (may contain argument placeholders) as value.May also link to an externally defined Properties object, e.g. defined through a PropertiesFactoryBean.
- 
getCommonMessagesReturn a Properties object defining locale-independent common messages, if any.
- 
setUseCodeAsDefaultMessagepublic void setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage) 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(java.lang.String, java.lang.Object[], java.util.Locale)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.
- 
isUseCodeAsDefaultMessageprotected boolean isUseCodeAsDefaultMessage()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(org.springframework.context.MessageSourceResolvable, java.util.Locale)method to return a custom fallback message for an unresolvable code.- See Also:
 
- 
getMessagepublic final String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale) Description copied from interface:MessageSourceTry to resolve the message. Return default message if no message was found.- Specified by:
- getMessagein interface- MessageSource
- Parameters:
- code- the message code to look up, e.g. 'calculator.noRateSet'. MessageSource users are encouraged to base message names on qualified class or package names, avoiding potential conflicts and ensuring maximum clarity.
- args- an array of arguments that will be filled in for params within the message (params look like "{0}", "{1,date}", "{2,time}" within a message), or- nullif none
- defaultMessage- a default message to return if the lookup fails
- locale- the locale in which to do the lookup
- Returns:
- the resolved message if the lookup was successful, otherwise
 the default message passed as a parameter (which may be null)
- See Also:
 
- 
getMessagepublic final String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException Description copied from interface:MessageSourceTry to resolve the message. Treat as an error if the message can't be found.- Specified by:
- getMessagein interface- MessageSource
- Parameters:
- code- the message code to look up, e.g. 'calculator.noRateSet'. MessageSource users are encouraged to base message names on qualified class or package names, avoiding potential conflicts and ensuring maximum clarity.
- args- an array of arguments that will be filled in for params within the message (params look like "{0}", "{1,date}", "{2,time}" within a message), or- nullif none
- locale- the locale in which to do the lookup
- Returns:
- the resolved message (never null)
- Throws:
- NoSuchMessageException- if no corresponding message was found
- See Also:
 
- 
getMessagepublic final String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException Description copied from interface:MessageSourceTry to resolve the message using all the attributes contained within theMessageSourceResolvableargument that was passed in.NOTE: We must throw a NoSuchMessageExceptionon this method since at the time of calling this method we aren't able to determine if thedefaultMessageproperty of the resolvable isnullor not.- Specified by:
- getMessagein interface- MessageSource
- Parameters:
- resolvable- the value object storing attributes required to resolve a message (may include a default message)
- locale- the locale in which to do the lookup
- Returns:
- the resolved message (never nullsince even aMessageSourceResolvable-provided default message needs to be non-null)
- Throws:
- NoSuchMessageException- if no corresponding message was found (and no default message was provided by the- MessageSourceResolvable)
- See Also:
 
- 
getMessageInternal@Nullable protected String getMessageInternal(@Nullable String code, @Nullable Object[] args, @Nullable Locale locale) Resolve the given code and arguments as message in the given Locale, returningnullif not found. Does not fall back to the code as default message. Invoked bygetMessagemethods.- Parameters:
- code- the code to lookup up, such as 'calculator.noRateSet'
- args- array of arguments that will be filled in for params within the message
- locale- the locale in which to do the lookup
- Returns:
- the resolved message, or nullif not found
- See Also:
 
- 
getMessageFromParent@Nullable protected String getMessageFromParent(String code, @Nullable Object[] args, Locale locale) Try to retrieve the given message from the parentMessageSource, if any.- Parameters:
- code- the code to lookup up, such as 'calculator.noRateSet'
- args- array of arguments that will be filled in for params within the message
- locale- the locale in which to do the lookup
- Returns:
- the resolved message, or nullif not found
- See Also:
 
- 
getDefaultMessageGet a default message for the givenMessageSourceResolvable.This implementation fully renders the default message if available, or just returns the plain default message Stringif the primary message code is being used as a default message.- Parameters:
- resolvable- the value object to resolve a default message for
- locale- the current locale
- Returns:
- the default message, or nullif none
- Since:
- 4.3.6
- See Also:
 
- 
getDefaultMessageReturn 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 NoSuchMessageExceptionfromgetMessage.- Parameters:
- code- the message code that we couldn't resolve and that we didn't receive an explicit default message for
- Returns:
- the default message to use, or nullif none
- See Also:
 
- 
resolveArgumentsSearches through the given array of objects, finds any MessageSourceResolvable objects and resolves them.Allows for messages to have MessageSourceResolvables as arguments. - Overrides:
- resolveArgumentsin class- MessageSourceSupport
- Parameters:
- args- array of arguments for a message
- locale- the locale to resolve through
- Returns:
- an array of arguments with any MessageSourceResolvables resolved
 
- 
resolveCodeWithoutArgumentsSubclasses can override this method to resolve a message without arguments in an optimized fashion, i.e. to resolve without involving a MessageFormat.The default implementation does use MessageFormat, through delegating to the resolveCode(java.lang.String, java.util.Locale)method. Subclasses are encouraged to replace this with optimized resolution.Unfortunately, java.text.MessageFormatis 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 is advisable to circumvent MessageFormat for messages without arguments.- Parameters:
- code- the code of the message to resolve
- locale- the locale to resolve the code for (subclasses are encouraged to support internationalization)
- Returns:
- the message String, or nullif not found
- See Also:
 
- 
resolveCodeSubclasses 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 the resolveCodeWithoutArguments(java.lang.String, java.util.Locale)javadoc for details.- Parameters:
- code- the code of the message to resolve
- locale- the locale to resolve the code for (subclasses are encouraged to support internationalization)
- Returns:
- the MessageFormat for the message, or nullif not found
- See Also:
 
 
-