Browse Source

Remember annotations when using withExistingValue

Update `Bindable` builder methods so that existing annotations are
retained.

Closes gh-18218
pull/18464/head
Phillip Webb 6 years ago
parent
commit
23174eb484
  1. 4
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/Bindable.java
  2. 14
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/BindableTests.java

4
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/Bindable.java

@ -162,7 +162,7 @@ public final class Bindable<T> { @@ -162,7 +162,7 @@ public final class Bindable<T> {
existingValue == null || this.type.isArray() || this.boxedType.resolve().isInstance(existingValue),
() -> "ExistingValue must be an instance of " + this.type);
Supplier<T> value = (existingValue != null) ? () -> existingValue : null;
return new Bindable<>(this.type, this.boxedType, value, NO_ANNOTATIONS);
return new Bindable<>(this.type, this.boxedType, value, this.annotations);
}
/**
@ -171,7 +171,7 @@ public final class Bindable<T> { @@ -171,7 +171,7 @@ public final class Bindable<T> {
* @return an updated {@link Bindable}
*/
public Bindable<T> withSuppliedValue(Supplier<T> suppliedValue) {
return new Bindable<>(this.type, this.boxedType, suppliedValue, NO_ANNOTATIONS);
return new Bindable<>(this.type, this.boxedType, suppliedValue, this.annotations);
}
/**

14
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/BindableTests.java

@ -160,6 +160,20 @@ public class BindableTests { @@ -160,6 +160,20 @@ public class BindableTests {
assertThat(bindable1).isEqualTo(bindable3);
}
@Test // gh-18218
public void withExistingValueDoesNotForgetAnnotations() {
Annotation annotation = AnnotationUtils.synthesizeAnnotation(TestAnnotation.class);
Bindable<?> bindable = Bindable.of(String.class).withAnnotations(annotation).withExistingValue("");
assertThat(bindable.getAnnotations()).containsExactly(annotation);
}
@Test // gh-18218
public void withSuppliedValueValueDoesNotForgetAnnotations() {
Annotation annotation = AnnotationUtils.synthesizeAnnotation(TestAnnotation.class);
Bindable<?> bindable = Bindable.of(String.class).withAnnotations(annotation).withSuppliedValue(() -> "");
assertThat(bindable.getAnnotations()).containsExactly(annotation);
}
@Retention(RetentionPolicy.RUNTIME)
@interface TestAnnotation {

Loading…
Cancel
Save