diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java index bcb30269c2f..4331c017f88 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java @@ -29,10 +29,12 @@ import org.springframework.lang.Nullable; * Extension of {@link LocaleResolver} that adds support for a rich locale context * (potentially including locale and time zone information). * - *
Also provides pre-implemented versions of {@link #resolveLocale} and {@link #setLocale}, - * delegating to {@link #resolveLocaleContext} and {@link #setLocaleContext}. + *
Also provides {@code default} implementations of {@link #resolveLocale} and + * {@link #setLocale} which delegate to {@link #resolveLocaleContext} and + * {@link #setLocaleContext}, respectively. * * @author Juergen Hoeller + * @author Sam Brannen * @since 4.0 * @see org.springframework.context.i18n.LocaleContext * @see org.springframework.context.i18n.TimeZoneAwareLocaleContext @@ -77,12 +79,32 @@ public interface LocaleContextResolver extends LocaleResolver { void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable LocaleContext localeContext); + /** + * Default implementation of {@link LocaleResolver#resolveLocale(HttpServletRequest)} + * that delegates to {@link #resolveLocaleContext(HttpServletRequest)}, falling + * back to {@link HttpServletRequest#getLocale()} if necessary. + * @param request the request to resolve the locale for + * @return the current locale (never {@code null}) + * @since 6.0 + */ @Override default Locale resolveLocale(HttpServletRequest request) { Locale locale = resolveLocaleContext(request).getLocale(); return (locale != null ? locale : request.getLocale()); } + /** + * Default implementation of {@link LocaleResolver#setLocale(HttpServletRequest, + * HttpServletResponse, Locale)} that delegates to + * {@link #setLocaleContext(HttpServletRequest, HttpServletResponse, LocaleContext)}, + * using a {@link SimpleLocaleContext}. + * @param request the request to be used for locale modification + * @param response the response to be used for locale modification + * @param locale the new locale, or {@code null} to clear the locale + * @throws UnsupportedOperationException if the LocaleResolver implementation + * does not support dynamic changing of the locale + * @since 6.0 + */ @Override default void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) { setLocaleContext(request, response, (locale != null ? new SimpleLocaleContext(locale) : null)); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java index 78c0ca77e11..0b07bc682f1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java @@ -24,8 +24,8 @@ import org.springframework.web.servlet.LocaleContextResolver; /** * Abstract base class for {@link LocaleContextResolver} implementations. * - *
Provides support for a {@linkplain #setDefaultLocale(Locale) default locale} - * and a {@linkplain #setDefaultTimeZone(TimeZone) default time zone}. + *
Provides support for a {@linkplain #setDefaultLocale(java.util.Locale) default
+ * locale} and a {@linkplain #setDefaultTimeZone(TimeZone) default time zone}.
*
* @author Juergen Hoeller
* @since 4.0
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java
index b776c60db17..0572bc70b7a 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java
@@ -52,6 +52,7 @@ import org.springframework.web.util.WebUtils;
* @author Juergen Hoeller
* @author Jean-Pierre Pawlak
* @author Vedran Pavic
+ * @author Sam Brannen
* @since 27.02.2003
* @see #setDefaultLocale
* @see #setDefaultTimeZone
@@ -98,10 +99,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
private Function The default implementation returns the specified default locale,
- * if any, else falls back to the request's accept-header locale.
+ * called if no locale cookie has been found.
+ * The default implementation returns the configured
+ * {@linkplain #setDefaultLocale(Locale) default locale}, if any, and otherwise
+ * falls back to the request's {@code Accept-Language} header locale or the
+ * default locale for the server.
* @param defaultLocaleFunction the function used to determine the default locale
* @since 6.0
* @see #setDefaultLocale
@@ -214,8 +214,8 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
/**
* Set the function used to determine the default time zone for the given request,
- * called if no {@link TimeZone} session attribute has been found.
- * The default implementation returns the specified default time zone,
+ * called if no locale cookie has been found.
+ * The default implementation returns the configured default time zone,
* if any, or {@code null} otherwise.
* @param defaultTimeZoneFunction the function used to determine the default time zone
* @since 6.0
@@ -321,8 +321,8 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
TimeZone timeZone = null;
if (localeContext != null) {
locale = localeContext.getLocale();
- if (localeContext instanceof TimeZoneAwareLocaleContext) {
- timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();
+ if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) {
+ timeZone = timeZoneAwareLocaleContext.getTimeZone();
}
addCookie(response,
(locale != null ? toLocaleValue(locale) : "-") + (timeZone != null ? '/' + timeZone.getID() : ""));
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java
index 45ae24649b6..67a19fea944 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java
@@ -90,10 +90,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
private Function The default implementation returns the specified default locale,
- * if any, else falls back to the request's accept-header locale.
+ * The default implementation returns the configured
+ * {@linkplain #setDefaultLocale(Locale) default locale}, if any, and otherwise
+ * falls back to the request's {@code Accept-Language} header locale or the
+ * default locale for the server.
* @param defaultLocaleFunction the function used to determine the default locale
* @since 6.0
* @see #setDefaultLocale
@@ -136,7 +135,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
/**
* Set the function used to determine the default time zone for the given request,
* called if no {@link TimeZone} session attribute has been found.
- * The default implementation returns the specified default time zone,
+ * The default implementation returns the configured default time zone,
* if any, or {@code null} otherwise.
* @param defaultTimeZoneFunction the function used to determine the default time zone
* @since 6.0
@@ -163,7 +162,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
public Locale getLocale() {
Locale locale = (Locale) WebUtils.getSessionAttribute(request, localeAttributeName);
if (locale == null) {
- locale = SessionLocaleResolver.this.defaultLocaleFunction.apply(request);
+ locale = defaultLocaleFunction.apply(request);
}
return locale;
}
@@ -172,7 +171,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
public TimeZone getTimeZone() {
TimeZone timeZone = (TimeZone) WebUtils.getSessionAttribute(request, timeZoneAttributeName);
if (timeZone == null) {
- timeZone = SessionLocaleResolver.this.defaultTimeZoneFunction.apply(request);
+ timeZone = defaultTimeZoneFunction.apply(request);
}
return timeZone;
}
@@ -187,8 +186,8 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
TimeZone timeZone = null;
if (localeContext != null) {
locale = localeContext.getLocale();
- if (localeContext instanceof TimeZoneAwareLocaleContext) {
- timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();
+ if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) {
+ timeZone = timeZoneAwareLocaleContext.getTimeZone();
}
}
WebUtils.setSessionAttribute(request, this.localeAttributeName, locale);
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java
index 73f519cb8f2..7063f5964b5 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java
@@ -171,10 +171,10 @@ public abstract class RequestContextUtils {
@Nullable
public static TimeZone getTimeZone(HttpServletRequest request) {
LocaleResolver localeResolver = getLocaleResolver(request);
- if (localeResolver instanceof LocaleContextResolver) {
- LocaleContext localeContext = ((LocaleContextResolver) localeResolver).resolveLocaleContext(request);
- if (localeContext instanceof TimeZoneAwareLocaleContext) {
- return ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();
+ if (localeResolver instanceof LocaleContextResolver localeContextResolver) {
+ LocaleContext localeContext = localeContextResolver.resolveLocaleContext(request);
+ if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) {
+ return timeZoneAwareLocaleContext.getTimeZone();
}
}
return null;
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java
index 2a7c0bd9713..7cc0467b2af 100644
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java
+++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java
@@ -412,7 +412,7 @@ class CookieLocaleResolverTests {
}
@Test
- void testCustomDefaultLocaleFunction() {
+ void customDefaultLocaleFunction() {
request.addPreferredLocale(Locale.TAIWAN);
resolver.setDefaultLocaleFunction(request -> Locale.GERMAN);
@@ -421,7 +421,7 @@ class CookieLocaleResolverTests {
}
@Test
- void testCustomDefaultTimeZoneFunction() {
+ void customDefaultTimeZoneFunction() {
request.addPreferredLocale(Locale.TAIWAN);
resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1"));
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java
index 8b78dfcfd62..de9256f4bde 100644
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java
+++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java
@@ -98,17 +98,16 @@ class SessionLocaleResolverTests {
}
@Test
- void testCustomDefaultLocaleFunction() {
+ void customDefaultLocaleFunction() {
request.addPreferredLocale(Locale.TAIWAN);
- SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.setDefaultLocaleFunction(request -> Locale.GERMAN);
assertThat(resolver.resolveLocale(request)).isEqualTo(Locale.GERMAN);
}
@Test
- void testCustomDefaultTimeZoneFunction() {
+ void customDefaultTimeZoneFunction() {
request.addPreferredLocale(Locale.TAIWAN);
resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1"));