Browse Source

Gracefully skip non-assignable reactive lambda callbacks on Java 18+.

Closes #2808, #2809.
pull/2823/head
Michael J. Simons 3 years ago committed by Oliver Drotbohm
parent
commit
a257a0399a
No known key found for this signature in database
GPG Key ID: C25FBFA0DA493A1D
  1. 3
      src/main/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacks.java
  2. 23
      src/test/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacksUnitTests.java

3
src/main/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacks.java

@ -37,6 +37,7 @@ import org.springframework.util.ReflectionUtils; @@ -37,6 +37,7 @@ import org.springframework.util.ReflectionUtils;
*
* @author Mark Paluch
* @author Christoph Strobl
* @author Michael J. Simons
*/
class DefaultReactiveEntityCallbacks implements ReactiveEntityCallbacks {
@ -112,7 +113,7 @@ class DefaultReactiveEntityCallbacks implements ReactiveEntityCallbacks { @@ -112,7 +113,7 @@ class DefaultReactiveEntityCallbacks implements ReactiveEntityCallbacks {
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())) {

23
src/test/java/org/springframework/data/mapping/callback/DefaultReactiveEntityCallbacksUnitTests.java

@ -17,6 +17,9 @@ package org.springframework.data.mapping.callback; @@ -17,6 +17,9 @@ package org.springframework.data.mapping.callback;
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.Bean; @@ -26,6 +29,7 @@ import org.springframework.context.annotation.Bean;
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 @@ import org.springframework.data.mapping.callback.CapturingEntityCallback.ThirdCa @@ -35,6 +39,7 @@ import org.springframework.data.mapping.callback.CapturingEntityCallback.ThirdCa
*
* @author Mark Paluch
* @author Christoph Strobl
* @author Michael J. Simons
*/
class DefaultReactiveEntityCallbacksUnitTests {
@ -124,6 +129,24 @@ class DefaultReactiveEntityCallbacksUnitTests { @@ -124,6 +129,24 @@ class DefaultReactiveEntityCallbacksUnitTests {
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<Person> 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 {

Loading…
Cancel
Save