22
22
import org .springframework .core .ReactiveAdapterRegistry ;
23
23
import org .springframework .lang .Nullable ;
24
24
import org .springframework .util .Assert ;
25
+ import org .springframework .util .ClassUtils ;
25
26
import org .springframework .web .bind .annotation .RequestBody ;
26
27
27
28
/**
33
34
*/
34
35
public class RequestBodyArgumentResolver implements HttpServiceArgumentResolver {
35
36
37
+ private static final boolean REACTOR_PRESENT =
38
+ ClassUtils .isPresent ("reactor.core.publisher.Mono" , RequestBodyArgumentResolver .class .getClassLoader ());
39
+
40
+
41
+ @ Nullable
36
42
private final ReactiveAdapterRegistry reactiveAdapterRegistry ;
37
43
38
44
39
45
/**
40
- * Default constructor that uses {@link ReactiveAdapterRegistry#getSharedInstance()} .
46
+ * Constructor with a {@link HttpExchangeAdapter}, for access to config settings .
41
47
* @since 6.1
42
48
*/
43
- public RequestBodyArgumentResolver () {
44
- this ( ReactiveAdapterRegistry . getSharedInstance ());
45
- }
46
-
47
- /**
48
- * Constructor with a {@link ReactiveAdapterRegistry}.
49
- */
50
- public RequestBodyArgumentResolver ( ReactiveAdapterRegistry reactiveAdapterRegistry ) {
51
- Assert . notNull ( reactiveAdapterRegistry , "ReactiveAdapterRegistry is required" ) ;
52
- this . reactiveAdapterRegistry = reactiveAdapterRegistry ;
49
+ public RequestBodyArgumentResolver (HttpExchangeAdapter exchangeAdapter ) {
50
+ if ( REACTOR_PRESENT ) {
51
+ this . reactiveAdapterRegistry =
52
+ ( exchangeAdapter instanceof ReactorHttpExchangeAdapter reactorAdapter ?
53
+ reactorAdapter . getReactiveAdapterRegistry () :
54
+ ReactiveAdapterRegistry . getSharedInstance ());
55
+ }
56
+ else {
57
+ this . reactiveAdapterRegistry = null ;
58
+ }
53
59
}
54
60
55
61
@@ -63,21 +69,25 @@ public boolean resolve(
63
69
}
64
70
65
71
if (argument != null ) {
66
- ReactiveAdapter reactiveAdapter = this .reactiveAdapterRegistry .getAdapter (parameter .getParameterType ());
67
- if (reactiveAdapter == null ) {
68
- requestValues .setBodyValue (argument );
69
- }
70
- else {
71
- MethodParameter nestedParameter = parameter .nested ();
72
+ if (this .reactiveAdapterRegistry != null ) {
73
+ ReactiveAdapter adapter = this .reactiveAdapterRegistry .getAdapter (parameter .getParameterType ());
74
+ if (adapter != null ) {
75
+ MethodParameter nestedParameter = parameter .nested ();
72
76
73
- String message = "Async type for @RequestBody should produce value(s)" ;
74
- Assert .isTrue (!reactiveAdapter .isNoValue (), message );
75
- Assert .isTrue (nestedParameter .getNestedParameterType () != Void .class , message );
77
+ String message = "Async type for @RequestBody should produce value(s)" ;
78
+ Assert .isTrue (!adapter .isNoValue (), message );
79
+ Assert .isTrue (nestedParameter .getNestedParameterType () != Void .class , message );
76
80
77
- requestValues .setBody (
78
- reactiveAdapter .toPublisher (argument ),
79
- ParameterizedTypeReference .forType (nestedParameter .getNestedGenericParameterType ()));
81
+ requestValues .setBody (
82
+ adapter .toPublisher (argument ),
83
+ ParameterizedTypeReference .forType (nestedParameter .getNestedGenericParameterType ()));
84
+
85
+ return true ;
86
+ }
80
87
}
88
+
89
+ // Not a reactive type
90
+ requestValues .setBodyValue (argument );
81
91
}
82
92
83
93
return true ;
0 commit comments