From bd8af55bc7448d17b84fa4dfbfb09f4a7cbf6552 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 16 Dec 2016 17:15:43 -0500 Subject: [PATCH] getAcceptLanguageAsLocale(s) returns most preferred Locale An update on the last commit switching from: List getAcceptLanguageAsLocales() to Locale getAcceptLanguageAsLocale() This best supports the scenario for the most preferred Locale. If there is a need to look at the prioritized list of languages it's best to use Locale.filter with the LocaleRange's. This is explained in the Javadoc for getAcceptLanguage(). Issue: SPR-15024 --- .../org/springframework/http/HttpHeaders.java | 22 ++++++++++++------- .../http/HttpHeadersTests.java | 8 +------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index 5bde57ceadc..95aec69306f 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -440,8 +440,8 @@ public class HttpHeaders implements MultiValueMap, Serializable } /** - * Set the acceptable language ranges, - * as specified by the {@literal Accept-Language} header. + * Set the acceptable language ranges, as specified by the + * {@literal Accept-Language} header. * @see Locale.LanguageRange * @since 5.0 */ @@ -458,8 +458,12 @@ public class HttpHeaders implements MultiValueMap, Serializable } /** - * Return the acceptable language ranges, - * as specified by the {@literal Accept-Language} header + * Return the acceptable language ranges from the + * {@literal Accept-Language} header + *

If you only need the most preferred locale use + * {@link #getAcceptLanguageAsLocale()} or if you need to filter based on + * a list of supporeted locales you can pass the returned list to + * {@link Locale#filter(List, Collection)}. * @see Locale.LanguageRange * @since 5.0 */ @@ -473,18 +477,20 @@ public class HttpHeaders implements MultiValueMap, Serializable /** * A variant of {@link #getAcceptLanguage()} that converts each - * {@link java.util.Locale.LanguageRange} to a {@link Locale}. + * {@link java.util.Locale.LanguageRange} to a {@link Locale} and returns + * the first one on the list. * @since 5.0 */ - public List getAcceptLanguageAsLocales() { + public Locale getAcceptLanguageAsLocale() { List ranges = getAcceptLanguage(); if (ranges.isEmpty()) { - return Collections.emptyList(); + return null; } return ranges.stream() .map(range -> Locale.forLanguageTag(range.getRange())) .filter(locale -> StringUtils.hasText(locale.getDisplayName())) - .collect(Collectors.toList()); + .findFirst() + .orElse(null); } /** diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index d2d94bc69f2..42a0f6faa9c 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -437,13 +437,7 @@ public class HttpHeadersTests { ); assertEquals(expectedRanges, headers.getAcceptLanguage()); - List expectedLocales = Arrays.asList( - Locale.forLanguageTag("fr-ch"), - Locale.forLanguageTag("fr"), - Locale.forLanguageTag("en"), - Locale.forLanguageTag("de") - ); - assertEquals(expectedLocales, headers.getAcceptLanguageAsLocales()); + assertEquals(Locale.forLanguageTag("fr-ch"), headers.getAcceptLanguageAsLocale()); } @Test