spring-framework/framework-docs/modules/ROOT/pages/languages/kotlin
Sam Brannen 03ae97b2eb Introduce Spring property for default escape character for placeholders
Spring Framework 6.2 introduced support for an escape character for
property placeholders (by default '\'). However, as of Spring Framework
6.2.6, there was no way to either escape the escape character or disable
escape character support.

For example, given a `username` property configured with the value of
`Jane.Smith` and a `DOMAIN\${username}` configuration string, property
placeholder replacement used to result in `DOMAIN\Jane.Smith` prior to
6.2 but now results in `DOMAIN${username}`. Similarly, an attempt to
escape the escape character via `DOMAIN\\${username}` results in
`DOMAIN\${username}`.

In theory, one should be able to disable use of an escape character
altogether, and that is currently possible by invoking
setEscapeCharacter(null) on AbstractPropertyResolver and
PlaceholderConfigurerSupport (the superclass of
PropertySourcesPlaceholderConfigurer).

However, in reality, there are two hurdles.

- As of 6.2.6, an invocation of setEscapeCharacter(null) on a
  PropertySourcesPlaceholderConfigurer applied to its internal
  top-level PropertySourcesPropertyResolver but not to any nested
  PropertySourcesPropertyResolver, which means that the `null` escape
  character could not be effectively applied.

- Users may not have an easy way to explicitly set the escape character
  to `null` for a PropertyResolver or
  PropertySourcesPlaceholderConfigurer. For example, Spring Boot
  auto-configures a PropertySourcesPlaceholderConfigurer with the
  default escape character enabled.

This first issue above has recently been addressed by gh-34861.

This commit therefore addresses the second issue as follows.

- To allow developers to easily revert to the pre-6.2 behavior without
  changes to code or configuration strings, this commit introduces a
  `spring.placeholder.escapeCharacter.default` property for use with
  SpringProperties which globally sets the default escape character that
  is automatically configured in AbstractPropertyResolver and
  PlaceholderConfigurerSupport.

- Setting the property to an empty string sets the default escape
  character to `null`, effectively disabling the default support for
  escape characters.

    spring.placeholder.escapeCharacter.default =

- Setting the property to any other character sets the default escape
  character to that specific character.

    spring.placeholder.escapeCharacter.default = ~

- Setting the property to a string containing more than one character
  results in an exception.

- Developers are still able to configure an explicit escape character
  in AbstractPropertyResolver and PlaceholderConfigurerSupport if they
  choose to do so.

- Third-party components that wish to rely on the same feature can
  invoke AbstractPropertyResolver.getDefaultEscapeCharacter() to obtain
  the globally configured default escape character.

See gh-9628
See gh-34315
See gh-34861
Closes gh-34865
2025-05-13 13:37:30 +02:00
..
annotations.adoc Polishing 2024-12-21 15:31:01 +01:00
bean-definition-dsl.adoc Update outdated elements in Kotlin reference documentation 2024-01-03 18:39:15 +01:00
classes-interfaces.adoc Extract recurring asciidoc links to attributes, cleanup old doc files 2023-11-21 15:59:24 +01:00
coroutines.adoc Consistently indent code with tabs in reference manual 2025-04-14 11:22:08 +02:00
extensions.adoc Extract recurring asciidoc links to attributes, cleanup old doc files 2023-11-21 15:59:24 +01:00
getting-started.adoc Update outdated elements in Kotlin reference documentation 2024-01-03 18:39:15 +01:00
null-safety.adoc Extract recurring asciidoc links to attributes, cleanup old doc files 2023-11-21 15:59:24 +01:00
requirements.adoc Update outdated elements in Kotlin reference documentation 2024-01-03 18:39:15 +01:00
resources.adoc Update outdated elements in Kotlin reference documentation 2024-01-03 18:39:15 +01:00
spring-projects-in.adoc Introduce Spring property for default escape character for placeholders 2025-05-13 13:37:30 +02:00
web.adoc Consistently indent code with tabs in reference manual 2025-04-14 11:22:08 +02:00