diff --git a/src/main/java/org/springframework/data/util/Lazy.java b/src/main/java/org/springframework/data/util/Lazy.java index a254b635b..779903e7c 100644 --- a/src/main/java/org/springframework/data/util/Lazy.java +++ b/src/main/java/org/springframework/data/util/Lazy.java @@ -37,6 +37,7 @@ import org.springframework.util.ObjectUtils; public class Lazy implements Supplier { private static final Lazy EMPTY = new Lazy<>(() -> null, null, true); + static final String UNRESOLVED = "[Unresolved]"; private final Supplier supplier; @@ -213,6 +214,21 @@ public class Lazy implements Supplier { return Lazy.of(() -> function.apply(get()).get()); } + /** + * Returns the {@link String} representation of the already resolved value or the one provided through the given + * {@link Supplier} if the value has not been resolved yet. + * + * @param fallback must not be {@literal null}. + * @return will never be {@literal null}. + * @since 3.0.1 + */ + public String toString(Supplier fallback) { + + Assert.notNull(fallback, "Fallback must not be null!"); + + return resolved ? toString() : fallback.get(); + } + /** * Returns the value of the lazy evaluation. * @@ -232,6 +248,16 @@ public class Lazy implements Supplier { return value; } + @Override + public String toString() { + + if (!resolved) { + return UNRESOLVED; + } + + return value == null ? "null" : value.toString(); + } + @Override public boolean equals(@Nullable Object o) { diff --git a/src/test/java/org/springframework/data/util/LazyUnitTests.java b/src/test/java/org/springframework/data/util/LazyUnitTests.java index 414fd8960..37c10c528 100755 --- a/src/test/java/org/springframework/data/util/LazyUnitTests.java +++ b/src/test/java/org/springframework/data/util/LazyUnitTests.java @@ -116,4 +116,35 @@ class LazyUnitTests { assertThat(empty.or(reference).get()).isEqualTo(reference); assertThat(empty.or(() -> reference).get()).isEqualTo(reference); } + + @Test // #2751 + void doesNotResolveValueForToString() { + + Supplier mock = mock(Supplier.class); + + var lazy = Lazy.of(mock); + + assertThat(lazy.toString()).isEqualTo(Lazy.UNRESOLVED); + verify(mock, never()).get(); + + lazy.getNullable(); + + assertThat(lazy.toString()).isNotEqualTo(Lazy.UNRESOLVED); + } + + @Test // #2751 + void usesFallbackForToStringOnUnresolvedInstance() { + + Supplier mock = mock(Supplier.class); + + var lazy = Lazy.of(mock); + var fallback = "fallback"; + + assertThat(lazy.toString(() -> fallback)).isEqualTo(fallback); + verify(mock, never()).get(); + + lazy.getNullable(); + + assertThat(lazy.toString(() -> fallback)).isNotEqualTo(fallback); + } }