From 1f4ca61b808a762bfbf69c09aced71aa4f589a41 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 3 May 2019 16:10:51 +0200 Subject: [PATCH] Polishing --- .../InstantiationAwareBeanPostProcessor.java | 18 ++++++++------- ...AbstractTypeHierarchyTraversingFilter.java | 16 +++++++++----- .../CustomSQLExceptionTranslatorRegistry.java | 20 +++++++++-------- .../DefaultJmsActivationSpecFactory.java | 18 ++++++++++----- .../PlatformTransactionManager.java | 5 ++--- .../transaction/annotation/Propagation.java | 6 ++--- .../interceptor/TransactionAspectSupport.java | 17 ++++++++------ .../AbstractPlatformTransactionManager.java | 11 +++++----- .../TransactionSynchronizationManager.java | 7 +++--- .../AbstractWebArgumentResolverAdapter.java | 6 +++-- .../AbstractHandlerExceptionResolver.java | 7 +++--- .../servlet/i18n/CookieLocaleResolver.java | 22 ++++++++++--------- .../servlet/i18n/LocaleChangeInterceptor.java | 6 +++-- 13 files changed, 92 insertions(+), 67 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java index ae498c01b5..0da8ff190f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -53,8 +53,9 @@ public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { * will be short-circuited. The only further processing applied is the * {@link #postProcessAfterInitialization} callback from the configured * {@link BeanPostProcessor BeanPostProcessors}. - *

This callback will only be applied to bean definitions with a bean class. - * In particular, it will not be applied to beans with a "factory-method". + *

This callback will be applied to bean definitions with their bean class, + * as well as to factory-method definitions in which case the returned bean type + * will be passed in here. *

Post-processors may implement the extended * {@link SmartInstantiationAwareBeanPostProcessor} interface in order * to predict the type of the bean object that they are going to return here. @@ -63,8 +64,9 @@ public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { * @return the bean object to expose instead of a default instance of the target bean, * or {@code null} to proceed with default instantiation * @throws org.springframework.beans.BeansException in case of errors - * @see org.springframework.beans.factory.support.AbstractBeanDefinition#hasBeanClass - * @see org.springframework.beans.factory.support.AbstractBeanDefinition#getFactoryMethodName + * @see #postProcessAfterInstantiation + * @see org.springframework.beans.factory.support.AbstractBeanDefinition#getBeanClass() + * @see org.springframework.beans.factory.support.AbstractBeanDefinition#getFactoryMethodName() */ Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException; @@ -80,6 +82,7 @@ public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { * Returning {@code false} will also prevent any subsequent InstantiationAwareBeanPostProcessor * instances being invoked on this bean instance. * @throws org.springframework.beans.BeansException in case of errors + * @see #postProcessBeforeInstantiation */ boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException; @@ -95,9 +98,8 @@ public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { * dependency types - which the factory handles specifically - already filtered out) * @param bean the bean instance created, but whose properties have not yet been set * @param beanName the name of the bean - * @return the actual property values to apply to the given bean - * (can be the passed-in PropertyValues instance), or {@code null} - * to skip property population + * @return the actual property values to apply to the given bean (can be the passed-in + * PropertyValues instance), or {@code null} to skip property population * @throws org.springframework.beans.BeansException in case of errors * @see org.springframework.beans.MutablePropertyValues */ diff --git a/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java b/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java index 4cf45e61b9..28864bd0c9 100644 --- a/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java +++ b/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2019 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. @@ -83,10 +83,12 @@ public abstract class AbstractTypeHierarchyTraversingFilter implements TypeFilte } } catch (IOException ex) { - logger.debug("Could not read super class [" + metadata.getSuperClassName() + - "] of type-filtered class [" + metadata.getClassName() + "]"); + if (logger.isDebugEnabled()) { + logger.debug("Could not read super class [" + metadata.getSuperClassName() + + "] of type-filtered class [" + metadata.getClassName() + "]"); + } } - } + } } } @@ -107,8 +109,10 @@ public abstract class AbstractTypeHierarchyTraversingFilter implements TypeFilte } } catch (IOException ex) { - logger.debug("Could not read interface [" + ifc + "] for type-filtered class [" + - metadata.getClassName() + "]"); + if (logger.isDebugEnabled()) { + logger.debug("Could not read interface [" + ifc + "] for type-filtered class [" + + metadata.getClassName() + "]"); + } } } } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java index e7372167df..ad42367ef2 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2019 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. @@ -70,14 +70,16 @@ public class CustomSQLExceptionTranslatorRegistry { * @param translator the custom translator */ public void registerTranslator(String dbName, SQLExceptionTranslator translator) { - SQLExceptionTranslator replaced = translatorMap.put(dbName, translator); - if (replaced != null) { - logger.warn("Replacing custom translator [" + replaced + "] for database '" + dbName + - "' with [" + translator + "]"); - } - else { - logger.info("Adding custom translator of type [" + translator.getClass().getName() + - "] for database '" + dbName + "'"); + SQLExceptionTranslator replaced = this.translatorMap.put(dbName, translator); + if (logger.isInfoEnabled()) { + if (replaced != null) { + logger.info("Replacing custom translator [" + replaced + "] for database '" + dbName + + "' with [" + translator + "]"); + } + else { + logger.info("Adding custom translator of type [" + translator.getClass().getName() + + "] for database '" + dbName + "'"); + } } } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java index 878966aaff..95b0e7ddbb 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2019 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. @@ -85,7 +85,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpec class found: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpec class found: " + specClassName); + } } } @@ -98,7 +100,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpecImpl class found: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpecImpl class found: " + specClassName); + } } } @@ -109,7 +113,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpecImpl class found in provider package: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpecImpl class found in provider package: " + specClassName); + } } // ActivationSpecImpl class in "inbound" subpackage (WebSphere MQ 6.0.2.1) @@ -118,7 +124,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpecImpl class found in inbound subpackage: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpecImpl class found in inbound subpackage: " + specClassName); + } } throw new IllegalStateException("No ActivationSpec class defined - " + diff --git a/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java index b42f345749..e768aeeadc 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2019 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. @@ -39,7 +39,6 @@ package org.springframework.transaction; * @since 16.05.2003 * @see org.springframework.transaction.support.TransactionTemplate * @see org.springframework.transaction.interceptor.TransactionInterceptor - * @see org.springframework.transaction.interceptor.TransactionProxyFactoryBean */ public interface PlatformTransactionManager { @@ -54,7 +53,7 @@ public interface PlatformTransactionManager { *

An exception to the above rule is the read-only flag, which should be * ignored if no explicit read-only mode is supported. Essentially, the * read-only flag is just a hint for potential optimization. - * @param definition TransactionDefinition instance (can be {@code null} for defaults), + * @param definition the TransactionDefinition instance (can be {@code null} for defaults), * describing propagation behavior, isolation level, timeout etc. * @return transaction status object representing the new or current transaction * @throws TransactionException in case of lookup, creation, or system errors diff --git a/spring-tx/src/main/java/org/springframework/transaction/annotation/Propagation.java b/spring-tx/src/main/java/org/springframework/transaction/annotation/Propagation.java index 95cc22fc9e..1e235ce877 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/annotation/Propagation.java +++ b/spring-tx/src/main/java/org/springframework/transaction/annotation/Propagation.java @@ -87,11 +87,11 @@ public enum Propagation { /** * Execute within a nested transaction if a current transaction exists, - * behave like {@code REQUIRED} else. There is no analogous feature in EJB. + * behave like {@code REQUIRED} otherwise. There is no analogous feature in EJB. *

Note: Actual creation of a nested transaction will only work on specific * transaction managers. Out of the box, this only applies to the JDBC - * DataSourceTransactionManager when working on a JDBC 3.0 driver. - * Some JTA providers might support nested transactions as well. + * DataSourceTransactionManager. Some JTA providers might support nested + * transactions as well. * @see org.springframework.jdbc.datasource.DataSourceTransactionManager */ NESTED(TransactionDefinition.PROPAGATION_NESTED); diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index e0602ca3f9..8ff61767a8 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -100,7 +100,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init *

To find out about specific transaction characteristics, consider using * TransactionSynchronizationManager's {@code isSynchronizationActive()} * and/or {@code isActualTransactionActive()} methods. - * @return TransactionInfo bound to this thread, or {@code null} if none + * @return the TransactionInfo bound to this thread, or {@code null} if none * @see TransactionInfo#hasTransaction() * @see org.springframework.transaction.support.TransactionSynchronizationManager#isSynchronizationActive() * @see org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive() @@ -275,7 +275,8 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) { // Standard transaction demarcation with getTransaction and commit/rollback calls. TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification); - Object retVal = null; + + Object retVal; try { // This is an around advice: Invoke the next interceptor in the chain. // This will normally result in a target object being invoked. @@ -369,6 +370,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init if (txAttr == null || this.beanFactory == null) { return getTransactionManager(); } + String qualifier = txAttr.getQualifier(); if (StringUtils.hasText(qualifier)) { return determineQualifiedTransactionManager(qualifier); @@ -493,9 +495,10 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init else { // The TransactionInfo.hasTransaction() method will return false. We created it only // to preserve the integrity of the ThreadLocal stack maintained in this class. - if (logger.isTraceEnabled()) - logger.trace("Don't need to create transaction for [" + joinpointIdentification + - "]: This method isn't transactional."); + if (logger.isTraceEnabled()) { + logger.trace("No need to create transaction for [" + joinpointIdentification + + "]: This method is not transactional."); + } } // We always bind the TransactionInfo to the thread, even if we didn't create @@ -585,7 +588,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init /** - * Opaque object used to hold Transaction information. Subclasses + * Opaque object used to hold transaction information. Subclasses * must pass it back to methods on this class, but not see its internals. */ protected final class TransactionInfo { diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java index 15286e7ed0..d992cbf5b4 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -560,7 +560,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) { return definition.getTimeout(); } - return this.defaultTimeout; + return getDefaultTimeout(); } @@ -682,7 +682,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran /** * Reactivate transaction synchronization for the current thread * and resume all given synchronizations. - * @param suspendedSynchronizations List of TransactionSynchronization objects + * @param suspendedSynchronizations a List of TransactionSynchronization objects */ private void doResumeSynchronization(List suspendedSynchronizations) { TransactionSynchronizationManager.initSynchronization(); @@ -994,7 +994,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran * given Spring TransactionSynchronization objects. *

To be called by this abstract manager itself, or by special implementations * of the {@code registerAfterCompletionWithExistingTransaction} callback. - * @param synchronizations List of TransactionSynchronization objects + * @param synchronizations a List of TransactionSynchronization objects * @param completionStatus the completion status according to the * constants in the TransactionSynchronization interface * @see #registerAfterCompletionWithExistingTransaction(Object, java.util.List) @@ -1244,7 +1244,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran * immediately, passing in "STATUS_UNKNOWN". This is the best we can do if there's no * chance to determine the actual outcome of the outer transaction. * @param transaction transaction object returned by {@code doGetTransaction} - * @param synchronizations List of TransactionSynchronization objects + * @param synchronizations a List of TransactionSynchronization objects * @throws TransactionException in case of system errors * @see #invokeAfterCompletion(java.util.List, int) * @see TransactionSynchronization#afterCompletion(int) @@ -1307,6 +1307,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran private SuspendedResourcesHolder( Object suspendedResources, List suspendedSynchronizations, String name, boolean readOnly, Integer isolationLevel, boolean wasActive) { + this.suspendedResources = suspendedResources; this.suspendedSynchronizations = suspendedSynchronizations; this.name = name; diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java index ebe43a3e69..bb0234a187 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -287,10 +287,11 @@ public abstract class TransactionSynchronizationManager { throws IllegalStateException { Assert.notNull(synchronization, "TransactionSynchronization must not be null"); - if (!isSynchronizationActive()) { + Set synchs = synchronizations.get(); + if (synchs == null) { throw new IllegalStateException("Transaction synchronization is not active"); } - synchronizations.get().add(synchronization); + synchs.add(synchronization); } /** diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java index f77926ec00..56dd8fcd16 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -80,7 +80,9 @@ public abstract class AbstractWebArgumentResolverAdapter implements HandlerMetho } catch (Exception ex) { // ignore (see class-level doc) - logger.debug("Error in checking support for parameter [" + parameter + "], message: " + ex.getMessage()); + if (logger.isDebugEnabled()) { + logger.debug("Error in checking support for parameter [" + parameter + "]: " + ex.getMessage()); + } return false; } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java index 6a2206cdce..e2af35be65 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 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. @@ -99,7 +99,6 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti *

Default is no warn logging. Specify this setting to activate warn logging into a specific * category. Alternatively, override the {@link #logException} method for custom logging. * @see org.apache.commons.logging.LogFactory#getLog(String) - * @see org.apache.log4j.Logger#getLogger(String) * @see java.util.logging.Logger#getLogger(String) */ public void setWarnLogCategory(String loggerName) { @@ -131,11 +130,11 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti prepareResponse(ex, response); ModelAndView result = doResolveException(request, response, handler, ex); if (result != null) { - // Print warn message when warn logger is not enabled... + // Print debug message when warn logger is not enabled. if (logger.isDebugEnabled() && (this.warnLogger == null || !this.warnLogger.isWarnEnabled())) { logger.debug("Resolved [" + ex + "]" + (result.isEmpty() ? "" : " to " + result)); } - // warnLogger with full stack trace (requires explicit config) + // Explicitly configured warn logger in logException method. logException(ex, request); } return result; 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 b53e42f5f4..bf6d7c2713 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -55,7 +55,7 @@ import org.springframework.web.util.WebUtils; public class CookieLocaleResolver extends CookieGenerator implements LocaleContextResolver { /** - * The name of the request attribute that holds the Locale. + * The name of the request attribute that holds the {@code Locale}. *

Only used for overriding a cookie value if the locale has been * changed in the course of the current request! *

Use {@code RequestContext(Utils).getLocale()} @@ -66,7 +66,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte public static final String LOCALE_REQUEST_ATTRIBUTE_NAME = CookieLocaleResolver.class.getName() + ".LOCALE"; /** - * The name of the request attribute that holds the TimeZone. + * The name of the request attribute that holds the {@code TimeZone}. *

Only used for overriding a cookie value if the locale has been * changed in the course of the current request! *

Use {@code RequestContext(Utils).getTimeZone()} @@ -122,14 +122,14 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte } /** - * Set a fixed Locale that this resolver will return if no cookie found. + * Set a fixed locale that this resolver will return if no cookie found. */ public void setDefaultLocale(Locale defaultLocale) { this.defaultLocale = defaultLocale; } /** - * Return the fixed Locale that this resolver will return if no cookie found, + * Return the fixed locale that this resolver will return if no cookie found, * if any. */ protected Locale getDefaultLocale() { @@ -137,7 +137,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte } /** - * Set a fixed TimeZone that this resolver will return if no cookie found. + * Set a fixed time zone that this resolver will return if no cookie found. * @since 4.0 */ public void setDefaultTimeZone(TimeZone defaultTimeZone) { @@ -145,7 +145,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte } /** - * Return the fixed TimeZone that this resolver will return if no cookie found, + * Return the fixed time zone that this resolver will return if no cookie found, * if any. * @since 4.0 */ @@ -177,10 +177,11 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte private void parseLocaleCookieIfNecessary(HttpServletRequest request) { if (request.getAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME) == null) { - // Retrieve and parse cookie value. - Cookie cookie = WebUtils.getCookie(request, getCookieName()); Locale locale = null; TimeZone timeZone = null; + + // Retrieve and parse cookie value. + Cookie cookie = WebUtils.getCookie(request, getCookieName()); if (cookie != null) { String value = cookie.getValue(); String localePart = value; @@ -214,6 +215,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte "'" + (timeZone != null ? " and time zone '" + timeZone.getID() + "'" : "")); } } + request.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME, (locale != null ? locale : determineDefaultLocale(request))); request.setAttribute(TIME_ZONE_REQUEST_ATTRIBUTE_NAME, @@ -296,7 +298,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte /** * Determine the default time zone for the given request, - * Called if no TimeZone cookie has been found. + * Called if no time zone cookie has been found. *

The default implementation returns the specified default time zone, * if any, or {@code null} otherwise. * @param request the request to resolve the time zone for diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java index 3fb58b4172..b691eef30e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2019 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. @@ -149,7 +149,9 @@ public class LocaleChangeInterceptor extends HandlerInterceptorAdapter { } catch (IllegalArgumentException ex) { if (isIgnoreInvalidLocale()) { - logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage()); + if (logger.isDebugEnabled()) { + logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage()); + } } else { throw ex;