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 cb2cf44b12c..c62fcef8a91 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -95,11 +95,15 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver { if (defaultLocale != null && request.getHeader("Accept-Language") == null) { return defaultLocale; } - Locale locale = request.getLocale(); - if (!isSupportedLocale(locale)) { - locale = findSupportedLocale(request, locale); + Locale requestLocale = request.getLocale(); + if (isSupportedLocale(requestLocale)) { + return requestLocale; } - return locale; + Locale supportedLocale = findSupportedLocale(request); + if (supportedLocale != null) { + return supportedLocale; + } + return (defaultLocale != null ? defaultLocale : requestLocale); } private boolean isSupportedLocale(Locale locale) { @@ -107,7 +111,7 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver { return (supportedLocales.isEmpty() || supportedLocales.contains(locale)); } - private Locale findSupportedLocale(HttpServletRequest request, Locale fallback) { + private Locale findSupportedLocale(HttpServletRequest request) { Enumeration requestLocales = request.getLocales(); while (requestLocales.hasMoreElements()) { Locale locale = requestLocales.nextElement(); @@ -115,7 +119,7 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver { return locale; } } - return fallback; + return null; } @Override 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 d9bb1a4cbe2..b22100b559c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.web.servlet.i18n; import java.util.Arrays; @@ -24,15 +25,14 @@ 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; +import static java.util.Locale.*; +import static org.junit.Assert.*; /** * Unit tests for {@link AcceptHeaderLocaleResolver}. + * * @author Rossen Stoyanchev + * @author Juergen Hoeller */ public class AcceptHeaderLocaleResolverTests { @@ -56,6 +56,17 @@ public class AcceptHeaderLocaleResolverTests { this.resolver.setSupportedLocales(Collections.singletonList(CANADA)); assertEquals(US, this.resolver.resolveLocale(request(US, UK))); } + @Test + + public void resolvePreferredNotSupportedWithDefault() { + this.resolver.setSupportedLocales(Arrays.asList(US, JAPAN)); + this.resolver.setDefaultLocale(Locale.JAPAN); + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader("Accept-Language", KOREA.toString()); + request.setPreferredLocales(Collections.singletonList(KOREA)); + assertEquals(Locale.JAPAN, this.resolver.resolveLocale(request)); + } @Test public void defaultLocale() throws Exception {