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