Simplify default locale/timezone resolution in cookie/session locale resolvers

At present, the customization of the default locale and timezone
resolution in CookieLocaleResolver and SessionLocaleResolver requires
subclassing them and overriding determineDefaultLocale and/or
determineDefaultTimeZone methods.

This commit simplifies resolution of the default locale and timezone
resolution by introducing dedicated functions for these purposes, thus
allowing customization without needing to resort to subclassing the
locale resolvers.

Closes gh-27609
This commit is contained in:
Vedran Pavic
2021-10-26 00:31:56 +02:00
committed by Sam Brannen
parent 94cc2da33b
commit 864dcf67d8
4 changed files with 146 additions and 21 deletions

View File

@@ -41,6 +41,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
* @author Juergen Hoeller
* @author Rick Evans
* @author Sam Brannen
* @author Vedran Pavic
*/
class CookieLocaleResolverTests {
@@ -410,4 +411,24 @@ class CookieLocaleResolverTests {
assertThat(localeCookie.getValue()).isEqualTo("");
}
@Test
void testCustomDefaultLocaleFunction() {
request.addPreferredLocale(Locale.TAIWAN);
resolver.setDefaultLocaleFunction(request -> Locale.GERMAN);
assertThat(resolver.resolveLocale(request)).isEqualTo(Locale.GERMAN);
}
@Test
void testCustomDefaultTimeZoneFunction() {
request.addPreferredLocale(Locale.TAIWAN);
resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1"));
TimeZoneAwareLocaleContext context = (TimeZoneAwareLocaleContext) resolver.resolveLocaleContext(request);
assertThat(context.getLocale()).isEqualTo(Locale.TAIWAN);
assertThat(context.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT+1"));
}
}

View File

@@ -17,10 +17,12 @@
package org.springframework.web.servlet.i18n;
import java.util.Locale;
import java.util.TimeZone;
import jakarta.servlet.http.HttpSession;
import org.junit.jupiter.api.Test;
import org.springframework.context.i18n.TimeZoneAwareLocaleContext;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
@@ -31,6 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Juergen Hoeller
* @author Sam Brannen
* @author Vedran Pavic
*/
class SessionLocaleResolverTests {
@@ -94,4 +97,25 @@ class SessionLocaleResolverTests {
assertThat(resolver.resolveLocale(request)).isEqualTo(Locale.TAIWAN);
}
@Test
void testCustomDefaultLocaleFunction() {
request.addPreferredLocale(Locale.TAIWAN);
SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.setDefaultLocaleFunction(request -> Locale.GERMAN);
assertThat(resolver.resolveLocale(request)).isEqualTo(Locale.GERMAN);
}
@Test
void testCustomDefaultTimeZoneFunction() {
request.addPreferredLocale(Locale.TAIWAN);
resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1"));
TimeZoneAwareLocaleContext context = (TimeZoneAwareLocaleContext) resolver.resolveLocaleContext(request);
assertThat(context.getLocale()).isEqualTo(Locale.TAIWAN);
assertThat(context.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT+1"));
}
}