AcceptHeaderLocaleResolver returns default locale in case of no supported locale found

Issue: SPR-15426
(cherry picked from commit ea98ee8)
This commit is contained in:
Juergen Hoeller 2017-04-10 15:36:13 +02:00
parent 597fe0720f
commit a3d199f4dd
2 changed files with 28 additions and 13 deletions

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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) { if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale; return defaultLocale;
} }
Locale locale = request.getLocale(); Locale requestLocale = request.getLocale();
if (!isSupportedLocale(locale)) { if (isSupportedLocale(requestLocale)) {
locale = findSupportedLocale(request, locale); return requestLocale;
} }
return locale; Locale supportedLocale = findSupportedLocale(request);
if (supportedLocale != null) {
return supportedLocale;
}
return (defaultLocale != null ? defaultLocale : requestLocale);
} }
private boolean isSupportedLocale(Locale locale) { private boolean isSupportedLocale(Locale locale) {
@ -107,7 +111,7 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver {
return (supportedLocales.isEmpty() || supportedLocales.contains(locale)); return (supportedLocales.isEmpty() || supportedLocales.contains(locale));
} }
private Locale findSupportedLocale(HttpServletRequest request, Locale fallback) { private Locale findSupportedLocale(HttpServletRequest request) {
Enumeration<Locale> requestLocales = request.getLocales(); Enumeration<Locale> requestLocales = request.getLocales();
while (requestLocales.hasMoreElements()) { while (requestLocales.hasMoreElements()) {
Locale locale = requestLocales.nextElement(); Locale locale = requestLocales.nextElement();
@ -115,7 +119,7 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver {
return locale; return locale;
} }
} }
return fallback; return null;
} }
@Override @Override

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.web.servlet.i18n; package org.springframework.web.servlet.i18n;
import java.util.Arrays; import java.util.Arrays;
@ -24,15 +25,14 @@ import org.junit.Test;
import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockHttpServletRequest;
import static java.util.Locale.CANADA; import static java.util.Locale.*;
import static java.util.Locale.JAPANESE; import static org.junit.Assert.*;
import static java.util.Locale.UK;
import static java.util.Locale.US;
import static org.junit.Assert.assertEquals;
/** /**
* Unit tests for {@link AcceptHeaderLocaleResolver}. * Unit tests for {@link AcceptHeaderLocaleResolver}.
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @author Juergen Hoeller
*/ */
public class AcceptHeaderLocaleResolverTests { public class AcceptHeaderLocaleResolverTests {
@ -56,6 +56,17 @@ public class AcceptHeaderLocaleResolverTests {
this.resolver.setSupportedLocales(Collections.singletonList(CANADA)); this.resolver.setSupportedLocales(Collections.singletonList(CANADA));
assertEquals(US, this.resolver.resolveLocale(request(US, UK))); 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 @Test
public void defaultLocale() throws Exception { public void defaultLocale() throws Exception {