diff --git a/build.gradle b/build.gradle
index fd35f92d4cc..72cd00c70f7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -140,14 +140,14 @@ configure(allprojects) { project ->
dependency "org.webjars:webjars-locator-core:0.37"
dependency "org.webjars:underscorejs:1.8.3"
- dependencySet(group: 'org.apache.tomcat', version: '9.0.24') {
+ dependencySet(group: 'org.apache.tomcat', version: '9.0.26') {
entry 'tomcat-util'
entry('tomcat-websocket') {
exclude group: "org.apache.tomcat", name: "tomcat-websocket-api"
exclude group: "org.apache.tomcat", name: "tomcat-servlet-api"
}
}
- dependencySet(group: 'org.apache.tomcat.embed', version: '9.0.22') {
+ dependencySet(group: 'org.apache.tomcat.embed', version: '9.0.26') {
entry 'tomcat-embed-core'
entry 'tomcat-embed-websocket'
}
@@ -344,7 +344,7 @@ configure([rootProject] + javaProjects) { project ->
}
checkstyle {
- toolVersion = "8.23"
+ toolVersion = "8.24"
configDir = rootProject.file("src/checkstyle")
}
diff --git a/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java b/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java
index 6c6deed99c7..d3775267746 100644
--- a/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java
+++ b/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java
@@ -39,7 +39,7 @@ import org.springframework.util.ClassUtils;
* @author Juergen Hoeller
* @since 11.11.2003
*/
-@SuppressWarnings({"serial" })
+@SuppressWarnings("serial")
public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFilter, Ordered, Serializable {
private final Advice advice;
diff --git a/spring-aop/src/main/java/org/springframework/aop/support/NameMatchMethodPointcut.java b/spring-aop/src/main/java/org/springframework/aop/support/NameMatchMethodPointcut.java
index 8d51a287aad..faf1b0f4f3a 100644
--- a/spring-aop/src/main/java/org/springframework/aop/support/NameMatchMethodPointcut.java
+++ b/spring-aop/src/main/java/org/springframework/aop/support/NameMatchMethodPointcut.java
@@ -27,6 +27,7 @@ import org.springframework.util.PatternMatchUtils;
/**
* Pointcut bean for simple method name matches, as an alternative to regexp patterns.
+ *
*
Does not handle overloaded methods: all methods with a given name will be eligible.
*
* @author Juergen Hoeller
diff --git a/spring-aop/src/main/java/org/springframework/aop/support/Pointcuts.java b/spring-aop/src/main/java/org/springframework/aop/support/Pointcuts.java
index 39c7e8c0ed2..7e2ac454dfd 100644
--- a/spring-aop/src/main/java/org/springframework/aop/support/Pointcuts.java
+++ b/spring-aop/src/main/java/org/springframework/aop/support/Pointcuts.java
@@ -26,6 +26,7 @@ import org.springframework.util.Assert;
/**
* Pointcut constants for matching getters and setters,
* and static methods useful for manipulating and evaluating pointcuts.
+ *
*
These methods are particularly useful for composing pointcuts
* using the union and intersection methods.
*
diff --git a/spring-aspects/spring-aspects.gradle b/spring-aspects/spring-aspects.gradle
index 00b94c9586b..b30a8107f98 100644
--- a/spring-aspects/spring-aspects.gradle
+++ b/spring-aspects/spring-aspects.gradle
@@ -20,7 +20,7 @@ dependencies {
optional(project(":spring-context-support")) // for JavaMail and JSR-107 support
optional(project(":spring-orm")) // for JPA exception translation support
optional(project(":spring-tx")) // for JPA, @Transactional support
- optional("javax.cache:cache-api") // for JCache aspect
+ optional("javax.cache:cache-api") // for JCache aspect
optional("javax.transaction:javax.transaction-api") // for @javax.transaction.Transactional support
testCompile(project(":spring-core")) // for CodeStyleAspect
testCompile(project(":spring-test"))
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
index 78bd3416dc8..4b2d208a32e 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
@@ -256,7 +256,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
public Constructor>[] determineCandidateConstructors(Class> beanClass, final String beanName)
throws BeanCreationException {
- // Let's check for lookup methods here..
+ // Let's check for lookup methods here...
if (!this.lookupMethodsChecked.contains(beanName)) {
if (AnnotationUtils.isCandidateClass(beanClass, Lookup.class)) {
try {
@@ -268,7 +268,8 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
Assert.state(this.beanFactory != null, "No BeanFactory available");
LookupOverride override = new LookupOverride(method, lookup.value());
try {
- RootBeanDefinition mbd = (RootBeanDefinition) this.beanFactory.getMergedBeanDefinition(beanName);
+ RootBeanDefinition mbd = (RootBeanDefinition)
+ this.beanFactory.getMergedBeanDefinition(beanName);
mbd.getMethodOverrides().addOverride(override);
}
catch (NoSuchBeanDefinitionException ex) {
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java
index 860f2f0a59a..45da25fa84d 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java
@@ -408,7 +408,7 @@ public class ConstructorArgumentValues {
for (Map.Entry entry : this.indexedArgumentValues.entrySet()) {
ValueHolder vh1 = entry.getValue();
ValueHolder vh2 = that.indexedArgumentValues.get(entry.getKey());
- if (!vh1.contentEquals(vh2)) {
+ if (vh2 == null || !vh1.contentEquals(vh2)) {
return false;
}
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java
index 7647b14ddf4..b1c6691d096 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java
@@ -181,8 +181,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess
@Nullable
private MutablePropertyValues propertyValues;
- @Nullable
- private MethodOverrides methodOverrides;
+ private MethodOverrides methodOverrides = new MethodOverrides();
@Nullable
private String initMethodName;
@@ -903,9 +902,6 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess
* Never returns {@code null}.
*/
public MethodOverrides getMethodOverrides() {
- if (this.methodOverrides == null) {
- this.methodOverrides = new MethodOverrides();
- }
return this.methodOverrides;
}
@@ -914,7 +910,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess
* @since 5.0.2
*/
public boolean hasMethodOverrides() {
- return (this.methodOverrides != null && !this.methodOverrides.isEmpty());
+ return !this.methodOverrides.isEmpty();
}
/**
@@ -1098,10 +1094,9 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess
public void validate() throws BeanDefinitionValidationException {
if (hasMethodOverrides() && getFactoryMethodName() != null) {
throw new BeanDefinitionValidationException(
- "Cannot combine static factory method with method overrides: " +
- "the static factory method must create the instance");
+ "Cannot combine factory method with container-generated method overrides: " +
+ "the factory method must create the concrete bean instance.");
}
-
if (hasBeanClass()) {
prepareMethodOverrides();
}
@@ -1113,14 +1108,9 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess
* @throws BeanDefinitionValidationException in case of validation failure
*/
public void prepareMethodOverrides() throws BeanDefinitionValidationException {
- // Check that lookup methods exists.
+ // Check that lookup methods exist and determine their overloaded status.
if (hasMethodOverrides()) {
- Set overrides = getMethodOverrides().getOverrides();
- synchronized (overrides) {
- for (MethodOverride mo : overrides) {
- prepareMethodOverride(mo);
- }
- }
+ getMethodOverrides().getOverrides().forEach(this::prepareMethodOverride);
}
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
index a81a5234047..88e9942e807 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
@@ -201,7 +201,7 @@ public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationSt
public int accept(Method method) {
MethodOverride methodOverride = getBeanDefinition().getMethodOverrides().getOverride(method);
if (logger.isTraceEnabled()) {
- logger.trace("Override for '" + method.getName() + "' is [" + methodOverride + "]");
+ logger.trace("MethodOverride for " + method + ": " + methodOverride);
}
if (methodOverride == null) {
return PASSTHROUGH;
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
index 6cc985c64e8..4f6dc67744b 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
@@ -325,7 +325,8 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
this.allowEagerClassLoading = otherListableFactory.allowEagerClassLoading;
this.dependencyComparator = otherListableFactory.dependencyComparator;
// A clone of the AutowireCandidateResolver since it is potentially BeanFactoryAware...
- setAutowireCandidateResolver(BeanUtils.instantiateClass(otherListableFactory.getAutowireCandidateResolver().getClass()));
+ setAutowireCandidateResolver(
+ BeanUtils.instantiateClass(otherListableFactory.getAutowireCandidateResolver().getClass()));
// Make resolvable dependencies (e.g. ResourceLoader) available here as well...
this.resolvableDependencies.putAll(otherListableFactory.resolvableDependencies);
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericBeanDefinition.java
index a8b5c702a8c..ca779d1e66e 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericBeanDefinition.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericBeanDefinition.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.
@@ -18,6 +18,7 @@ package org.springframework.beans.factory.support;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.lang.Nullable;
+import org.springframework.util.ObjectUtils;
/**
* GenericBeanDefinition is a one-stop shop for standard bean definition purposes.
@@ -84,7 +85,14 @@ public class GenericBeanDefinition extends AbstractBeanDefinition {
@Override
public boolean equals(@Nullable Object other) {
- return (this == other || (other instanceof GenericBeanDefinition && super.equals(other)));
+ if (this == other) {
+ return true;
+ }
+ if (!(other instanceof GenericBeanDefinition)) {
+ return false;
+ }
+ GenericBeanDefinition that = (GenericBeanDefinition) other;
+ return (ObjectUtils.nullSafeEquals(this.parentName, that.parentName) && super.equals(other));
}
@Override
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java
index 727fbeff7cd..a84a15f8302 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.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.
@@ -17,9 +17,8 @@
package org.springframework.beans.factory.support;
import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.LinkedHashSet;
import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
import org.springframework.lang.Nullable;
@@ -37,9 +36,7 @@ import org.springframework.lang.Nullable;
*/
public class MethodOverrides {
- private final Set overrides = Collections.synchronizedSet(new LinkedHashSet<>(2));
-
- private volatile boolean modified = false;
+ private final Set overrides = new CopyOnWriteArraySet<>();
/**
@@ -61,7 +58,6 @@ public class MethodOverrides {
*/
public void addOverrides(@Nullable MethodOverrides other) {
if (other != null) {
- this.modified = true;
this.overrides.addAll(other.overrides);
}
}
@@ -70,7 +66,6 @@ public class MethodOverrides {
* Add the given method override.
*/
public void addOverride(MethodOverride override) {
- this.modified = true;
this.overrides.add(override);
}
@@ -80,7 +75,6 @@ public class MethodOverrides {
* @see MethodOverride
*/
public Set getOverrides() {
- this.modified = true;
return this.overrides;
}
@@ -88,7 +82,7 @@ public class MethodOverrides {
* Return whether the set of method overrides is empty.
*/
public boolean isEmpty() {
- return (!this.modified || this.overrides.isEmpty());
+ return this.overrides.isEmpty();
}
/**
@@ -98,18 +92,13 @@ public class MethodOverrides {
*/
@Nullable
public MethodOverride getOverride(Method method) {
- if (!this.modified) {
- return null;
- }
- synchronized (this.overrides) {
- MethodOverride match = null;
- for (MethodOverride candidate : this.overrides) {
- if (candidate.matches(method)) {
- match = candidate;
- }
+ MethodOverride match = null;
+ for (MethodOverride candidate : this.overrides) {
+ if (candidate.matches(method)) {
+ match = candidate;
}
- return match;
}
+ return match;
}
@@ -123,7 +112,6 @@ public class MethodOverrides {
}
MethodOverrides that = (MethodOverrides) other;
return this.overrides.equals(that.overrides);
-
}
@Override
diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
index 5ee213efaad..b10dd72eba6 100644
--- a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
+++ b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
@@ -856,6 +856,18 @@ class DefaultListableBeanFactoryTests {
lbf.registerAlias("test", "test3");
}
+ @Test
+ void aliasChaining() {
+ lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
+ lbf.registerAlias("test", "testAlias");
+ lbf.registerAlias("testAlias", "testAlias2");
+ lbf.registerAlias("testAlias2", "testAlias3");
+ Object bean = lbf.getBean("test");
+ assertThat(lbf.getBean("testAlias")).isSameAs(bean);
+ assertThat(lbf.getBean("testAlias2")).isSameAs(bean);
+ assertThat(lbf.getBean("testAlias3")).isSameAs(bean);
+ }
+
@Test
void beanDefinitionOverriding() {
lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class));
@@ -866,6 +878,43 @@ class DefaultListableBeanFactoryTests {
assertThat(lbf.getBean("test2")).isInstanceOf(NestedTestBean.class);
}
+ @Test
+ void beanDefinitionOverridingNotAllowed() {
+ lbf.setAllowBeanDefinitionOverriding(false);
+ BeanDefinition oldDef = new RootBeanDefinition(TestBean.class);
+ BeanDefinition newDef = new RootBeanDefinition(NestedTestBean.class);
+ lbf.registerBeanDefinition("test", oldDef);
+ assertThatExceptionOfType(BeanDefinitionOverrideException.class).isThrownBy(() ->
+ lbf.registerBeanDefinition("test", newDef))
+ .satisfies(ex -> {
+ assertThat(ex.getBeanName()).isEqualTo("test");
+ assertThat(ex.getBeanDefinition()).isEqualTo(newDef);
+ assertThat(ex.getExistingDefinition()).isEqualTo(oldDef);
+ });
+ }
+
+ @Test
+ void beanDefinitionOverridingWithAlias() {
+ lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class));
+ lbf.registerAlias("test", "testAlias");
+ lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
+ lbf.registerAlias("test", "testAlias");
+ assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
+ assertThat(lbf.getBean("testAlias")).isInstanceOf(NestedTestBean.class);
+ }
+
+ @Test
+ void beanDefinitionOverridingWithConstructorArgumentMismatch() {
+ RootBeanDefinition bd1 = new RootBeanDefinition(NestedTestBean.class);
+ bd1.getConstructorArgumentValues().addIndexedArgumentValue(1, "value1");
+ lbf.registerBeanDefinition("test", bd1);
+ RootBeanDefinition bd2 = new RootBeanDefinition(NestedTestBean.class);
+ bd2.getConstructorArgumentValues().addIndexedArgumentValue(0, "value0");
+ lbf.registerBeanDefinition("test", bd2);
+ assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
+ assertThat(lbf.getBean("test", NestedTestBean.class).getCompany()).isEqualTo("value0");
+ }
+
@Test
void beanDefinitionRemoval() {
lbf.setAllowBeanDefinitionOverriding(false);
@@ -908,43 +957,6 @@ class DefaultListableBeanFactoryTests {
lbf.removeBeanDefinition(name);
}
- @Test
- void beanDefinitionOverridingNotAllowed() {
- lbf.setAllowBeanDefinitionOverriding(false);
- BeanDefinition oldDef = new RootBeanDefinition(TestBean.class);
- BeanDefinition newDef = new RootBeanDefinition(NestedTestBean.class);
- lbf.registerBeanDefinition("test", oldDef);
- assertThatExceptionOfType(BeanDefinitionOverrideException.class).isThrownBy(() ->
- lbf.registerBeanDefinition("test", newDef))
- .satisfies(ex -> {
- assertThat(ex.getBeanName()).isEqualTo("test");
- assertThat(ex.getBeanDefinition()).isEqualTo(newDef);
- assertThat(ex.getExistingDefinition()).isEqualTo(oldDef);
- });
- }
-
- @Test
- void beanDefinitionOverridingWithAlias() {
- lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class));
- lbf.registerAlias("test", "testAlias");
- lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
- lbf.registerAlias("test", "testAlias");
- assertThat(lbf.getBean("test")).isInstanceOf(NestedTestBean.class);
- assertThat(lbf.getBean("testAlias")).isInstanceOf(NestedTestBean.class);
- }
-
- @Test
- void aliasChaining() {
- lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
- lbf.registerAlias("test", "testAlias");
- lbf.registerAlias("testAlias", "testAlias2");
- lbf.registerAlias("testAlias2", "testAlias3");
- Object bean = lbf.getBean("test");
- assertThat(lbf.getBean("testAlias")).isSameAs(bean);
- assertThat(lbf.getBean("testAlias2")).isSameAs(bean);
- assertThat(lbf.getBean("testAlias3")).isSameAs(bean);
- }
-
@Test
void beanReferenceWithNewSyntax() {
Properties p = new Properties();
diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanDefinitionTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanDefinitionTests.java
index ca9eef9d045..aa4841914ea 100644
--- a/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanDefinitionTests.java
+++ b/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanDefinitionTests.java
@@ -114,6 +114,27 @@ public class BeanDefinitionTests {
assertThat(bd.hashCode() == otherBd.hashCode()).isTrue();
}
+ @Test
+ public void genericBeanDefinitionEquality() {
+ GenericBeanDefinition bd = new GenericBeanDefinition();
+ bd.setParentName("parent");
+ bd.setScope("request");
+ bd.setAbstract(true);
+ bd.setLazyInit(true);
+ GenericBeanDefinition otherBd = new GenericBeanDefinition();
+ otherBd.setScope("request");
+ otherBd.setAbstract(true);
+ otherBd.setLazyInit(true);
+ boolean condition1 = !bd.equals(otherBd);
+ assertTrue(condition1);
+ boolean condition = !otherBd.equals(bd);
+ assertTrue(condition);
+ otherBd.setParentName("parent");
+ assertTrue(bd.equals(otherBd));
+ assertTrue(otherBd.equals(bd));
+ assertTrue(bd.hashCode() == otherBd.hashCode());
+ }
+
@Test
public void beanDefinitionHolderEquality() {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
diff --git a/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java b/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java
index 50ab5ccb317..981200b5388 100644
--- a/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java
+++ b/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java
@@ -87,25 +87,26 @@ public abstract class AbstractCacheManager implements CacheManager, Initializing
@Override
@Nullable
public Cache getCache(String name) {
+ // Quick check for existing cache...
Cache cache = this.cacheMap.get(name);
if (cache != null) {
return cache;
}
- else {
- // Fully synchronize now for missing cache creation...
+
+ // The provider may support on-demand cache creation...
+ Cache missingCache = getMissingCache(name);
+ if (missingCache != null) {
+ // Fully synchronize now for missing cache registration
synchronized (this.cacheMap) {
cache = this.cacheMap.get(name);
if (cache == null) {
- cache = getMissingCache(name);
- if (cache != null) {
- cache = decorateCache(cache);
- this.cacheMap.put(name, cache);
- updateCacheNames(name);
- }
+ cache = decorateCache(missingCache);
+ this.cacheMap.put(name, cache);
+ updateCacheNames(name);
}
- return cache;
}
}
+ return cache;
}
@Override
diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/ShadowingClassLoader.java b/spring-context/src/main/java/org/springframework/instrument/classloading/ShadowingClassLoader.java
index 2e00a49bfbb..49869101d2c 100644
--- a/spring-context/src/main/java/org/springframework/instrument/classloading/ShadowingClassLoader.java
+++ b/spring-context/src/main/java/org/springframework/instrument/classloading/ShadowingClassLoader.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.
diff --git a/spring-core/src/main/java/org/springframework/asm/SpringAsmInfo.java b/spring-core/src/main/java/org/springframework/asm/SpringAsmInfo.java
index 745a1ecec66..d74833951db 100644
--- a/spring-core/src/main/java/org/springframework/asm/SpringAsmInfo.java
+++ b/spring-core/src/main/java/org/springframework/asm/SpringAsmInfo.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.
@@ -18,7 +18,7 @@ package org.springframework.asm;
/**
* Utility class exposing constants related to Spring's internal repackaging
- * of the ASM bytecode library: currently based on ASM 7.0 plus minor patches.
+ * of the ASM bytecode library: currently based on ASM 7.x plus minor patches.
*
* See package-level javadocs for more
* information on {@code org.springframework.asm}.
diff --git a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java
index fa5aca29f8c..bb8dc01f571 100644
--- a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java
+++ b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java
@@ -980,8 +980,8 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen
/**
- * Strategy class used to manage {@link Reference References}. This class can be overridden if
- * alternative reference types need to be supported.
+ * Strategy class used to manage {@link Reference References}.
+ * This class can be overridden if alternative reference types need to be supported.
*/
protected class ReferenceManager {
diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java
index f94b49965ca..77e514dd757 100644
--- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java
+++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java
@@ -155,7 +155,7 @@ public class ExchangeResult {
/**
- * Return the status of the executed request.
+ * Return the HTTP status code as an {@link HttpStatus} enum value.
*/
public HttpStatus getStatus() {
return this.response.getStatusCode();
@@ -219,16 +219,12 @@ public class ExchangeResult {
"\n" +
formatBody(getRequestHeaders().getContentType(), this.requestBody) + "\n" +
"\n" +
- "< " + getStatus() + " " + getStatusReason() + "\n" +
+ "< " + getStatus() + " " + getStatus().getReasonPhrase() + "\n" +
"< " + formatHeaders(getResponseHeaders(), "\n< ") + "\n" +
"\n" +
formatBody(getResponseHeaders().getContentType(), this.responseBody) +"\n";
}
- private String getStatusReason() {
- return getStatus().getReasonPhrase();
- }
-
private String formatHeaders(HttpHeaders headers, String delimiter) {
return headers.entrySet().stream()
.map(entry -> entry.getKey() + ": " + entry.getValue())
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.java
index e55d68285db..de636f2ad85 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.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.
@@ -41,7 +41,7 @@ public class SseEmitter extends ResponseBodyEmitter {
static final MediaType TEXT_PLAIN = new MediaType("text", "plain", StandardCharsets.UTF_8);
- static final MediaType UTF8_TEXT_EVENTSTREAM = new MediaType("text", "event-stream", StandardCharsets.UTF_8);
+ static final MediaType TEXT_EVENTSTREAM = new MediaType("text", "event-stream", StandardCharsets.UTF_8);
/**
@@ -70,7 +70,7 @@ public class SseEmitter extends ResponseBodyEmitter {
HttpHeaders headers = outputMessage.getHeaders();
if (headers.getContentType() == null) {
- headers.setContentType(UTF8_TEXT_EVENTSTREAM);
+ headers.setContentType(TEXT_EVENTSTREAM);
}
}
@@ -82,10 +82,8 @@ public class SseEmitter extends ResponseBodyEmitter {
* SseEmitter emitter = new SseEmitter();
* emitter.send(event().data(myObject));
*
- *
* Please, see {@link ResponseBodyEmitter#send(Object) parent Javadoc}
* for important notes on exception handling.
- *
* @param object the object to write
* @throws IOException raised when an I/O error occurs
* @throws java.lang.IllegalStateException wraps any other errors
@@ -103,10 +101,8 @@ public class SseEmitter extends ResponseBodyEmitter {
* SseEmitter emitter = new SseEmitter();
* emitter.send(event().data(myObject, MediaType.APPLICATION_JSON));
*
- *
*
Please, see {@link ResponseBodyEmitter#send(Object) parent Javadoc}
* for important notes on exception handling.
- *
* @param object the object to write
* @param mediaType a MediaType hint for selecting an HttpMessageConverter
* @throws IOException raised when an I/O error occurs