Package org.springframework.validation

# Class DefaultMessageCodesResolver

java.lang.Object
org.springframework.validation.DefaultMessageCodesResolver

All Implemented Interfaces:
  `Serializable`, `MessageCodesResolver`

public class DefaultMessageCodesResolver extends Object implements MessageCodesResolver, Serializable
Default implementation of the `MessageCodesResolver` interface.

Will create two message codes for an object error, in the following order (when using the `prefixed` `formatter`):

- 1.: code + "." + object name
- 2.: code

Will create four message codes for a field specification, in the following order:

- 1.: code + "." + object name + "." + field
- 2.: code + "." + field
- 3.: code + "." + field type
- 4.: code

For example, in case of code "typeMismatch", object name "user", field "age":

- 1. try "typeMismatch.user.age"
- 2. try "typeMismatch.age"
- 3. try "typeMismatch.int"
- 4. try "typeMismatch"

This resolution algorithm thus can be leveraged for example to show specific messages for binding errors like "required" and "typeMismatch":

- at the object + field level ("age" field, but only on "user");
- at the field level (all "age" fields, no matter which object name);
- or at the general level (all fields, on any object).

In case of array, `List` or `Map` properties, both codes for specific elements and for the whole collection are generated. Assuming a field "name" of an array "groups" in object "user":

- 1. try "typeMismatch.user.groups[0].name"
- 2. try "typeMismatch.user.groups.name"
- 3. try "typeMismatch.groups[0].name"
- 4. try "typeMismatch.groups.name"
- 5. try "typeMismatch.name"
- 6. try "typeMismatch.java.lang.String"
- 7. try "typeMismatch"

By default the `errorCode`s will be placed at the beginning of constructed message strings. The `messageCodeFormatter` property can be used to specify an alternative concatenation `format`.

In order to group all codes into a specific category within your resource bundles, for example, "validation.typeMismatch.name" instead of the default "typeMismatch.name", consider specifying a `prefix` to be applied.

Since:
  1.0.1
Author:
  Juergen Hoeller, Phillip Webb, Chris Beams
See Also:
  - Serialized Form

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`static enum`
`DefaultMessageCodesResolver.Format`
Common message code formats.

## Field Summary

Fields
Modifier and Type
Field
Description
`static final String`
`CODE_SEPARATOR`
The separator that this implementation uses when resolving message codes.

## Constructor Summary

Constructors
Constructor
Description
`DefaultMessageCodesResolver()`

## Method Summary

Modifier and Type
Method
Description
`protected void`
`buildFieldList(String field, List<String> fieldList)`
Add both keyed and non-keyed entries for the supplied `field` to the supplied field list.
`protected String`
`getPrefix()`
Return the prefix to be applied to any code built by this resolver.
`protected String`
`postProcessMessageCode(String code)`
Post-process the given message code, built by this resolver.
`String[]`
`resolveMessageCodes(String errorCode, String objectName)`
Build message codes for the given error code and object name.
`String[]`
`resolveMessageCodes(String errorCode, String objectName, String field, Class<?> fieldType)`
Build the code list for the given code and field: an object/field-specific code, a field-specific code, a plain error code.
`void`
`setMessageCodeFormatter(MessageCodeFormatter formatter)`
Specify the format for message codes built by this resolver.
`void`
`setPrefix(String prefix)`
Specify a prefix to be applied to any code built by this resolver.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### CODE_SEPARATOR

public static final String CODE_SEPARATOR
The separator that this implementation uses when resolving message codes.

See Also:
  - Constant Field Values

## Constructor Details

### DefaultMessageCodesResolver

public DefaultMessageCodesResolver()

## Method Details

### setPrefix

public void setPrefix(@Nullable String prefix)
Specify a prefix to be applied to any code built by this resolver.

Default is none. Specify, for example, "validation." to get error codes like "validation.typeMismatch.name".

### getPrefix

protected String getPrefix()
Return the prefix to be applied to any code built by this resolver.

Returns an empty String in case of no prefix.

### setMessageCodeFormatter

public void setMessageCodeFormatter(@Nullable MessageCodeFormatter formatter)
Specify the format for message codes built by this resolver.

The default is `DefaultMessageCodesResolver.Format.PREFIX_ERROR_CODE`.

Since:
  3.2
See Also:
  - `DefaultMessageCodesResolver.Format`

### resolveMessageCodes

public String[] resolveMessageCodes(String errorCode, String objectName)
Description copied from interface: `MessageCodesResolver`
Build message codes for the given error code and object name. Used for building the codes list of an ObjectError.

Specified by:
  `resolveMessageCodes` in interface `MessageCodesResolver`
Parameters:
  `errorCode` - the error code used for rejecting the object
  `objectName` - the name of the object
Returns:
  the message codes to use

### resolveMessageCodes

public String[] resolveMessageCodes(String errorCode, String objectName, String field, @Nullable Class<?> fieldType)
Build the code list for the given code and field: an object/field-specific code, a field-specific code, a plain error code.

Arrays, Lists and Maps are resolved both for specific elements and the whole collection.

See the `class level javadoc` for details on the generated codes.

Specified by:
  `resolveMessageCodes` in interface `MessageCodesResolver`
Parameters:
  `errorCode` - the error code used for rejecting the value
  `objectName` - the name of the object
  `field` - the field name
  `fieldType` - the field type (may be `null` if not determinable)
Returns:
  the list of codes

### buildFieldList

protected void buildFieldList(String field, List<String> fieldList)
Add both keyed and non-keyed entries for the supplied `field` to the supplied field list.

### postProcessMessageCode

protected String postProcessMessageCode(String code)
Post-process the given message code, built by this resolver.

The default implementation applies the specified prefix, if any.

Parameters:
  `code` - the message code as built by this resolver
Returns:
  the final message code to be returned
See Also:
  - `setPrefix(java.lang.String)`