Skip to content

Commit dd464fc

Browse files
Gracefully skip non-assignable reactive lambda callbacks on Java 18+.
Closes spring-projects#2808.
1 parent e1ec982 commit dd464fc

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
*
3838
* @author Mark Paluch
3939
* @author Christoph Strobl
40+
* @author Michael J. Simons
4041
*/
4142
class DefaultReactiveEntityCallbacks implements ReactiveEntityCallbacks {
4243

@@ -112,7 +113,7 @@ public <T> Mono<T> invokeCallback(EntityCallback<T> callback, T entity,
112113

113114
throw new IllegalArgumentException(
114115
String.format("Callback invocation on %s returned null value for %s", callback.getClass(), entity));
115-
} catch (ClassCastException ex) {
116+
} catch (IllegalArgumentException | ClassCastException ex) {
116117

117118
String msg = ex.getMessage();
118119
if (msg == null || EntityCallbackInvoker.matchesClassCastMessage(msg, entity.getClass())) {

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

+23
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717

1818
import static org.assertj.core.api.Assertions.*;
1919

20+
import java.util.ArrayList;
21+
import java.util.List;
22+
2023
import reactor.core.publisher.Mono;
2124
import reactor.test.StepVerifier;
2225

@@ -26,6 +29,7 @@
2629
import org.springframework.context.annotation.Configuration;
2730
import org.springframework.data.mapping.Person;
2831
import org.springframework.data.mapping.PersonDocument;
32+
import org.springframework.data.mapping.PersonNoId;
2933
import org.springframework.data.mapping.callback.CapturingEntityCallback.FirstCallback;
3034
import org.springframework.data.mapping.callback.CapturingEntityCallback.SecondCallback;
3135
import org.springframework.data.mapping.callback.CapturingEntityCallback.ThirdCallback;
@@ -35,6 +39,7 @@
3539
*
3640
* @author Mark Paluch
3741
* @author Christoph Strobl
42+
* @author Michael J. Simons
3843
*/
3944
class DefaultReactiveEntityCallbacksUnitTests {
4045

@@ -124,6 +129,24 @@ void errorsOnNullValueReturnedByCallbackEntity() {
124129
assertThat(third.capturedValues()).isEmpty();
125130
}
126131

132+
@Test // GH-2808
133+
void skipsInvocationUsingJava18ReflectiveTypeRejection() {
134+
135+
DefaultReactiveEntityCallbacks callbacks = new DefaultReactiveEntityCallbacks();
136+
callbacks.addEntityCallback(new DefaultEntityCallbacksUnitTests.Java18ClassCastStyle());
137+
138+
Person person = new PersonNoId(42, "Walter", "White");
139+
List<Person> capturedPerson = new ArrayList<>();
140+
141+
callbacks.callback(DefaultEntityCallbacksUnitTests.BeforeConvertCallback.class, person) //
142+
.as(StepVerifier::create)
143+
.recordWith(() -> capturedPerson)
144+
.expectNextCount(1)
145+
.verifyComplete();
146+
147+
assertThat(capturedPerson.get(0)).isSameAs(person);
148+
}
149+
127150
@Configuration
128151
static class MyConfig {
129152

0 commit comments

Comments
 (0)