Top Description Fields Constructors Methods
org.springframework.context.support

public abstract Class AbstractMessageSource

extends MessageSourceSupport
implements HierarchicalMessageSource
Class Inheritance
All Implemented Interfaces
org.springframework.context.HierarchicalMessageSource, org.springframework.context.MessageSource
Known Direct Subclasses
org.springframework.context.support.AbstractResourceBasedMessageSource, org.springframework.context.support.StaticMessageSource
Imports
java.text.MessageFormat, java.util.ArrayList, .List, .Locale, .Properties, org.springframework.context.HierarchicalMessageSource, .MessageSource, .MessageSourceResolvable, .NoSuchMessageException, org.springframework.lang.Nullable, org.springframework.util.ObjectUtils

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.

Authors
Juergen Hoeller, Rod Johnson
See Also
resolveCode(String, java.util.Locale), resolveCodeWithoutArguments(String, java.util.Locale), setAlwaysUseMessageFormat, java.text.MessageFormat

Field Summary

Modifier and TypeField and Description
private Properties
private MessageSource
private boolean
Inherited from org.springframework.context.support.MessageSourceSupport:
logger

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
protected Properties
getCommonMessages()

Return a Properties object defining locale-independent common messages, if any.

protected String

Returns:

the default message, or null if none
getDefaultMessage
(MessageSourceResolvable
the value object to resolve a default message for
resolvable
,
Locale
the current locale
locale
)

Get a default message for the given MessageSourceResolvable.

protected String

Returns:

the default message to use, or null if none
getDefaultMessage
(String
the message code that we couldn't resolve and that we didn't receive an explicit default message for
code
)

Return a fallback default message for the given code, if any.

public final String
getMessage(String
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.
code
,
Object[]
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 null if none
args
,
String
a default message to return if the lookup fails
defaultMessage
,
Locale
the locale in which to do the lookup
locale
)

Implements org.springframework.context.MessageSource.getMessage.

Try to resolve the message.

public final String
getMessage(String
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.
code
,
Object[]
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 null if none
args
,
Locale
the locale in which to do the lookup
locale
)

Implements org.springframework.context.MessageSource.getMessage.

Try to resolve the message.

public final String
getMessage(MessageSourceResolvable
the value object storing attributes required to resolve a message (may include a default message)
resolvable
,
Locale
the locale in which to do the lookup
locale
)

Implements org.springframework.context.MessageSource.getMessage.

Try to resolve the message using all the attributes contained within the MessageSourceResolvable argument that was passed in.

Note

We must throw a NoSuchMessageException on this method since at the time of calling this method we aren't able to determine if the defaultMessage property of the resolvable is null or not.

protected String

Returns:

the resolved message, or null if not found
getMessageFromParent
(String
the code to lookup up, such as 'calculator.noRateSet'
code
,
Object[]
array of arguments that will be filled in for params within the message
args
,
Locale
the locale in which to do the lookup
locale
)

Try to retrieve the given message from the parent MessageSource, if any.

protected String

Returns:

the resolved message, or null if not found
getMessageInternal
(String
the code to lookup up, such as 'calculator.noRateSet'
code
,
Object[]
array of arguments that will be filled in for params within the message
args
,
Locale
the locale in which to do the lookup
locale
)

Resolve the given code and arguments as message in the given Locale, returning null if not found.

public MessageSource
getParentMessageSource()

Implements org.springframework.context.HierarchicalMessageSource.getParentMessageSource.

Return the parent of this MessageSource, or null if none.

protected boolean
isUseCodeAsDefaultMessage()

Return whether to use the message code as default message instead of throwing a NoSuchMessageException.

protected Object[]

Returns:

an array of arguments with any MessageSourceResolvables resolved
resolveArguments
(Object[]
array of arguments for a message
args
,
Locale
the locale to resolve through
locale
)

Overrides org.springframework.context.support.MessageSourceSupport.resolveArguments.

Searches through the given array of objects, finds any MessageSourceResolvable objects and resolves them.

protected abstract MessageFormat

Returns:

the MessageFormat for the message, or null if not found
resolveCode
(String
the code of the message to resolve
code
,
Locale
the locale to resolve the code for (subclasses are encouraged to support internationalization)
locale
)

Subclasses must implement this method to resolve a message.

protected String

Returns:

the message String, or null if not found
resolveCodeWithoutArguments
(String
the code of the message to resolve
code
,
Locale
the locale to resolve the code for (subclasses are encouraged to support internationalization)
locale
)

Subclasses can override this method to resolve a message without arguments in an optimized fashion, i.e. to resolve without involving a MessageFormat.

public void
setCommonMessages(Properties commonMessages)

Specify locale-independent common messages, with the message code as key and the full message String (may contain argument placeholders) as value.

public void
setParentMessageSource(MessageSource
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.
parent
)

Implements org.springframework.context.HierarchicalMessageSource.setParentMessageSource.

Set the parent that will be used to try to resolve messages that this object can't resolve.

public void
setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage)

Set whether to use the message code as default message instead of throwing a NoSuchMessageException.

Inherited from org.springframework.context.support.MessageSourceSupport:
createMessageFormatformatMessageisAlwaysUseMessageFormatrenderDefaultMessagesetAlwaysUseMessageFormat

Field Detail

commonMessagesback to summary
private Properties commonMessages
Annotations
@Nullable
parentMessageSourceback to summary
private MessageSource parentMessageSource
Annotations
@Nullable
useCodeAsDefaultMessageback to summary
private boolean useCodeAsDefaultMessage

Constructor Detail

AbstractMessageSourceback to summary
public AbstractMessageSource()

Method Detail

getCommonMessagesback to summary
protected Properties getCommonMessages()

Return a Properties object defining locale-independent common messages, if any.

Annotations
@Nullable
getDefaultMessageback to summary
protected String getDefaultMessage(MessageSourceResolvable resolvable, Locale locale)

Get a default message for the given MessageSourceResolvable.

This implementation fully renders the default message if available, or just returns the plain default message String if the primary message code is being used as a default message.

Parameters
resolvable:MessageSourceResolvable

the value object to resolve a default message for

locale:Locale

the current locale

Returns:String

the default message, or null if none

Annotations
@Nullable
Since
4.3.6
See Also
renderDefaultMessage(String, Object[], Locale), getDefaultMessage(String)
getDefaultMessageback to summary
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. In case of no fallback, the caller will usually receive a NoSuchMessageException from getMessage.

Parameters
code:String

the message code that we couldn't resolve and that we didn't receive an explicit default message for

Returns:String

the default message to use, or null if none

Annotations
@Nullable
See Also
setUseCodeAsDefaultMessage
getMessageback to summary
public final String getMessage(String code, Object[] args, String defaultMessage, Locale locale)

Implements org.springframework.context.MessageSource.getMessage.

Doc from org.springframework.context.MessageSource.getMessage.

Try to resolve the message. Return default message if no message was found.

Parameters
code:String

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:Object[]

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 null if none

defaultMessage:String

a default message to return if the lookup fails

locale:Locale

the locale in which to do the lookup

Returns:String

the resolved message if the lookup was successful, otherwise the default message passed as a parameter (which may be null)

Annotations
@Override
getMessageback to summary
public final String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException

Implements org.springframework.context.MessageSource.getMessage.

Doc from org.springframework.context.MessageSource.getMessage.

Try to resolve the message. Treat as an error if the message can't be found.

Parameters
code:String

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:Object[]

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 null if none

locale:Locale

the locale in which to do the lookup

Returns:String

the resolved message (never null)

Annotations
@Override
Exceptions
NoSuchMessageException:
if no corresponding message was found
getMessageback to summary
public final String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException

Implements org.springframework.context.MessageSource.getMessage.

Doc from org.springframework.context.MessageSource.getMessage.

Try to resolve the message using all the attributes contained within the MessageSourceResolvable argument that was passed in.

Note

We must throw a NoSuchMessageException on this method since at the time of calling this method we aren't able to determine if the defaultMessage property of the resolvable is null or not.

Parameters
resolvable:MessageSourceResolvable

the value object storing attributes required to resolve a message (may include a default message)

locale:Locale

the locale in which to do the lookup

Returns:String

the resolved message (never null since even a MessageSourceResolvable-provided default message needs to be non-null)

Annotations
@Override
Exceptions
NoSuchMessageException:
if no corresponding message was found (and no default message was provided by the MessageSourceResolvable)
getMessageFromParentback to summary
protected String getMessageFromParent(String code, Object[] args, Locale locale)

Try to retrieve the given message from the parent MessageSource, if any.

Parameters
code:String

the code to lookup up, such as 'calculator.noRateSet'

args:Object[]

array of arguments that will be filled in for params within the message

locale:Locale

the locale in which to do the lookup

Returns:String

the resolved message, or null if not found

Annotations
@Nullable
See Also
getParentMessageSource()
getMessageInternalback to summary
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. Does not fall back to the code as default message. Invoked by getMessage methods.

Parameters
code:String

the code to lookup up, such as 'calculator.noRateSet'

args:Object[]

array of arguments that will be filled in for params within the message

locale:Locale

the locale in which to do the lookup

Returns:String

the resolved message, or null if not found

Annotations
@Nullable
See Also
getMessage(String, Object[], String, Locale), getMessage(String, Object[], Locale), getMessage(MessageSourceResolvable, Locale), setUseCodeAsDefaultMessage
getParentMessageSourceback to summary
public MessageSource getParentMessageSource()

Implements org.springframework.context.HierarchicalMessageSource.getParentMessageSource.

Doc from org.springframework.context.HierarchicalMessageSource.getParentMessageSource.

Return the parent of this MessageSource, or null if none.

Annotations
@Override
@Nullable
isUseCodeAsDefaultMessageback to summary
protected 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 method to return a custom fallback message for an unresolvable code.

See Also
getDefaultMessage(String)
resolveArgumentsback to summary
protected Object[] resolveArguments(Object[] args, Locale locale)

Overrides org.springframework.context.support.MessageSourceSupport.resolveArguments.

Searches through the given array of objects, finds any MessageSourceResolvable objects and resolves them.

Allows for messages to have MessageSourceResolvables as arguments.

Parameters
args:Object[]

array of arguments for a message

locale:Locale

the locale to resolve through

Returns:Object[]

an array of arguments with any MessageSourceResolvables resolved

Annotations
@Override
resolveCodeback to summary
protected abstract MessageFormat resolveCode(String code, Locale locale)

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 the resolveCodeWithoutArguments javadoc for details.

Parameters
code:String

the code of the message to resolve

locale:Locale

the locale to resolve the code for (subclasses are encouraged to support internationalization)

Returns:MessageFormat

the MessageFormat for the message, or null if not found

Annotations
@Nullable
See Also
resolveCodeWithoutArguments(String, java.util.Locale)
resolveCodeWithoutArgumentsback to summary
protected String resolveCodeWithoutArguments(String code, Locale locale)

Subclasses 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 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 is advisable to circumvent MessageFormat for messages without arguments.

Parameters
code:String

the code of the message to resolve

locale:Locale

the locale to resolve the code for (subclasses are encouraged to support internationalization)

Returns:String

the message String, or null if not found

Annotations
@Nullable
See Also
resolveCode, java.text.MessageFormat
setCommonMessagesback to summary
public void setCommonMessages(Properties commonMessages)

Specify 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 org.springframework.beans.factory.config.PropertiesFactoryBean.

setParentMessageSourceback to summary
public void setParentMessageSource(MessageSource parent)

Implements org.springframework.context.HierarchicalMessageSource.setParentMessageSource.

Doc from org.springframework.context.HierarchicalMessageSource.setParentMessageSource.

Set the parent that will be used to try to resolve messages that this object can't resolve.

Parameters
parent:MessageSource

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.

Annotations
@Override
setUseCodeAsDefaultMessageback to summary
public 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 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
getMessage(String, Object[], Locale), org.springframework.validation.FieldError