From e2f69d040a2af89a11d48ad0b7a1d6d5a2691aa2 Mon Sep 17 00:00:00 2001 From: Johnny Lim Date: Mon, 27 May 2019 13:38:54 +0900 Subject: [PATCH] Use actual resolvedType when checking Binder cache Update `JavaBeanBinder` so that the `isOfDifferentType` method checks both the actual type and the resolved type. Prior to this commit, it was possible that when `canCallGetValue` is `true` the `resolvedType` could be different from `type.resolve`. Closes gh-16974 --- .../boot/context/properties/bind/JavaBeanBinder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/JavaBeanBinder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/JavaBeanBinder.java index c307c3a56ab..f4c8acc08d0 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/JavaBeanBinder.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/JavaBeanBinder.java @@ -192,12 +192,12 @@ class JavaBeanBinder implements BeanBinder { }); } - private boolean isOfDifferentType(ResolvableType targetType) { + private boolean isOfDifferentType(ResolvableType targetType, + Class resolvedType) { if (this.type.hasGenerics() || targetType.hasGenerics()) { return !this.type.equals(targetType); } - return this.resolvedType == null - || !this.resolvedType.equals(targetType.resolve()); + return this.resolvedType == null || !this.resolvedType.equals(resolvedType); } @SuppressWarnings("unchecked") @@ -214,7 +214,7 @@ class JavaBeanBinder implements BeanBinder { return null; } Bean bean = Bean.cached; - if (bean == null || bean.isOfDifferentType(type)) { + if (bean == null || bean.isOfDifferentType(type, resolvedType)) { bean = new Bean<>(type, resolvedType); cached = bean; }