From 8c80ec1138da8f56548affc0f0685be15f869231 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 13 Dec 2022 11:07:22 +0100 Subject: [PATCH] Avoid NPE on BeanDescriptor access with SimpleBeanInfoFactory Closes gh-29681 (cherry picked from commit d74191427eca4420d2d0d9a8e69cd0f5d25204a5) --- .../beans/SimpleBeanInfoFactory.java | 5 +++++ .../springframework/beans/BeanWrapperTests.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/spring-beans/src/main/java/org/springframework/beans/SimpleBeanInfoFactory.java b/spring-beans/src/main/java/org/springframework/beans/SimpleBeanInfoFactory.java index 1313867007e6..d9e811f79bca 100644 --- a/spring-beans/src/main/java/org/springframework/beans/SimpleBeanInfoFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/SimpleBeanInfoFactory.java @@ -16,6 +16,7 @@ package org.springframework.beans; +import java.beans.BeanDescriptor; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; @@ -51,6 +52,10 @@ public BeanInfo getBeanInfo(Class beanClass) throws IntrospectionException { PropertyDescriptorUtils.determineBasicProperties(beanClass); return new SimpleBeanInfo() { + @Override + public BeanDescriptor getBeanDescriptor() { + return new BeanDescriptor(beanClass); + } @Override public PropertyDescriptor[] getPropertyDescriptors() { return pds.toArray(PropertyDescriptorUtils.EMPTY_PROPERTY_DESCRIPTOR_ARRAY); diff --git a/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java b/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java index 17a775a7f123..5011797666d3 100644 --- a/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java @@ -77,6 +77,21 @@ void aliasedSetterThroughDefaultMethod() { assertThat(accessor.getPropertyValue("aliasedName")).isEqualTo("tom"); } + @Test + void replaceWrappedInstance() { + GetterBean target = new GetterBean(); + BeanWrapperImpl accessor = createAccessor(target); + accessor.setPropertyValue("name", "tom"); + assertThat(target.getAliasedName()).isEqualTo("tom"); + assertThat(accessor.getPropertyValue("aliasedName")).isEqualTo("tom"); + + target = new GetterBean(); + accessor.setWrappedInstance(target); + accessor.setPropertyValue("name", "tom"); + assertThat(target.getAliasedName()).isEqualTo("tom"); + assertThat(accessor.getPropertyValue("aliasedName")).isEqualTo("tom"); + } + @Test void setValidAndInvalidPropertyValuesShouldContainExceptionDetails() { TestBean target = new TestBean();