diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java index 1c0e154531..2ea825b9ab 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java @@ -42,6 +42,8 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver { private final List supportedLocales = new ArrayList(); + private Locale defaultLocale; + /** * Configure supported locales to check against the requested locales @@ -65,9 +67,32 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver { return this.supportedLocales; } + /** + * Configure a fixed default locale to fall back on if the request does not + * have an "Accept-Language" header. + *

By default this is not set in which case when there is "Accept-Lanaguage" + * header, the default locale for the server is used as defined in + * {@link HttpServletRequest#getLocale()}. + * @param defaultLocale the default locale to use + * @since 4.3 + */ + public void setDefaultLocale(Locale defaultLocale) { + this.defaultLocale = defaultLocale; + } + + /** + * The configured default locale. + */ + public Locale getDefaultLocale() { + return this.defaultLocale; + } + @Override public Locale resolveLocale(HttpServletRequest request) { + if (getDefaultLocale() != null && request.getHeader("Accept-Language") == null) { + return getDefaultLocale(); + } Locale locale = request.getLocale(); if (!isSupportedLocale(locale)) { locale = findSupportedLocale(request, locale); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolverTests.java index 668e67fbc3..d9bb1a4cbe 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolverTests.java @@ -25,6 +25,7 @@ import org.junit.Test; import org.springframework.mock.web.test.MockHttpServletRequest; import static java.util.Locale.CANADA; +import static java.util.Locale.JAPANESE; import static java.util.Locale.UK; import static java.util.Locale.US; import static org.junit.Assert.assertEquals; @@ -56,6 +57,17 @@ public class AcceptHeaderLocaleResolverTests { assertEquals(US, this.resolver.resolveLocale(request(US, UK))); } + @Test + public void defaultLocale() throws Exception { + this.resolver.setDefaultLocale(JAPANESE); + MockHttpServletRequest request = new MockHttpServletRequest(); + assertEquals(JAPANESE, this.resolver.resolveLocale(request)); + + request.addHeader("Accept-Language", US.toString()); + request.setPreferredLocales(Collections.singletonList(US)); + assertEquals(US, this.resolver.resolveLocale(request)); + } + private HttpServletRequest request(Locale... locales) { MockHttpServletRequest request = new MockHttpServletRequest();