diff --git a/src/main/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacks.java b/src/main/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacks.java index fc20b88a46..f10665e300 100644 --- a/src/main/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacks.java +++ b/src/main/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacks.java @@ -37,6 +37,7 @@ * * @author Mark Paluch * @author Christoph Strobl + * @author Michael J. Simons */ class DefaultReactiveEntityCallbacks implements ReactiveEntityCallbacks { @@ -112,7 +113,7 @@ public Mono invokeCallback(EntityCallback callback, T entity, throw new IllegalArgumentException( String.format("Callback invocation on %s returned null value for %s", callback.getClass(), entity)); - } catch (ClassCastException ex) { + } catch (IllegalArgumentException | ClassCastException ex) { String msg = ex.getMessage(); if (msg == null || EntityCallbackInvoker.matchesClassCastMessage(msg, entity.getClass())) { diff --git a/src/test/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacksUnitTests.java b/src/test/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacksUnitTests.java index 0b59dbacf9..ae836f017d 100644 --- a/src/test/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacksUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacksUnitTests.java @@ -17,6 +17,9 @@ import static org.assertj.core.api.Assertions.*; +import java.util.ArrayList; +import java.util.List; + import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -26,6 +29,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.mapping.Person; import org.springframework.data.mapping.PersonDocument; +import org.springframework.data.mapping.PersonNoId; import org.springframework.data.mapping.callback.CapturingEntityCallback.FirstCallback; import org.springframework.data.mapping.callback.CapturingEntityCallback.SecondCallback; import org.springframework.data.mapping.callback.CapturingEntityCallback.ThirdCallback; @@ -35,6 +39,7 @@ * * @author Mark Paluch * @author Christoph Strobl + * @author Michael J. Simons */ class DefaultReactiveEntityCallbacksUnitTests { @@ -124,6 +129,24 @@ void errorsOnNullValueReturnedByCallbackEntity() { assertThat(third.capturedValues()).isEmpty(); } + @Test // GH-2808 + void skipsInvocationUsingJava18ReflectiveTypeRejection() { + + DefaultReactiveEntityCallbacks callbacks = new DefaultReactiveEntityCallbacks(); + callbacks.addEntityCallback(new DefaultEntityCallbacksUnitTests.Java18ClassCastStyle()); + + Person person = new PersonNoId(42, "Walter", "White"); + List capturedPerson = new ArrayList<>(); + + callbacks.callback(DefaultEntityCallbacksUnitTests.BeforeConvertCallback.class, person) // + .as(StepVerifier::create) + .recordWith(() -> capturedPerson) + .expectNextCount(1) + .verifyComplete(); + + assertThat(capturedPerson.get(0)).isSameAs(person); + } + @Configuration static class MyConfig {