16
16
17
17
package org .springframework .integration .gateway ;
18
18
19
- import java .util .HashMap ;
19
+ import java .util .Arrays ;
20
20
import java .util .Map ;
21
21
import java .util .concurrent .Executor ;
22
+ import java .util .stream .Collectors ;
22
23
23
24
import org .springframework .beans .factory .config .ConfigurableListableBeanFactory ;
24
25
import org .springframework .core .annotation .AnnotatedElementUtils ;
28
29
import org .springframework .expression .common .LiteralExpression ;
29
30
import org .springframework .integration .annotation .AnnotationConstants ;
30
31
import org .springframework .integration .annotation .MessagingGateway ;
32
+ import org .springframework .integration .util .JavaUtils ;
33
+ import org .springframework .lang .Nullable ;
31
34
import org .springframework .util .Assert ;
32
35
import org .springframework .util .ObjectUtils ;
33
36
import org .springframework .util .StringUtils ;
@@ -48,6 +51,7 @@ public class AnnotationGatewayProxyFactoryBean extends GatewayProxyFactoryBean {
48
51
49
52
public AnnotationGatewayProxyFactoryBean (Class <?> serviceInterface ) {
50
53
super (serviceInterface );
54
+
51
55
AnnotationAttributes annotationAttributes =
52
56
AnnotatedElementUtils .getMergedAnnotationAttributes (serviceInterface ,
53
57
MessagingGateway .class .getName (), false , true );
@@ -68,14 +72,37 @@ public AnnotationGatewayProxyFactoryBean(Class<?> serviceInterface) {
68
72
protected void onInit () {
69
73
ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory ) getBeanFactory ();
70
74
71
- String defaultPayloadExpression =
72
- beanFactory .resolveEmbeddedValue (
73
- this .gatewayAttributes .getString ("defaultPayloadExpression" ));
75
+ populateGatewayMethodMetadata ();
76
+
77
+ JavaUtils .INSTANCE
78
+ .acceptIfHasText (resolveAttribute ("defaultRequestChannel" ), this ::setDefaultRequestChannelName )
79
+ .acceptIfHasText (resolveAttribute ("defaultReplyChannel" ), this ::setDefaultReplyChannelName )
80
+ .acceptIfHasText (resolveAttribute ("errorChannel" ), this ::setErrorChannelName )
81
+ .acceptIfHasText (resolveAttribute ("defaultRequestTimeout" ),
82
+ value -> setDefaultRequestTimeout (Long .parseLong (value )))
83
+ .acceptIfHasText (resolveAttribute ("defaultReplyTimeout" ),
84
+ value -> setDefaultReplyTimeout (Long .parseLong (value )));
85
+
86
+ String asyncExecutor = beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString ("asyncExecutor" ));
87
+ if (asyncExecutor == null || AnnotationConstants .NULL .equals (asyncExecutor )) {
88
+ setAsyncExecutor (null );
89
+ }
90
+ else if (StringUtils .hasText (asyncExecutor )) {
91
+ setAsyncExecutor (beanFactory .getBean (asyncExecutor , Executor .class ));
92
+ }
93
+
94
+ super .onInit ();
95
+ }
96
+
97
+ private void populateGatewayMethodMetadata () {
98
+ ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory ) getBeanFactory ();
99
+
100
+ String defaultPayloadExpression = resolveAttribute ("defaultPayloadExpression" );
74
101
75
102
@ SuppressWarnings ("unchecked" )
76
103
Map <String , Object >[] defaultHeaders = (Map <String , Object >[]) this .gatewayAttributes .get ("defaultHeaders" );
77
104
78
- String mapper = beanFactory . resolveEmbeddedValue ( this . gatewayAttributes . getString ( "mapper" ) );
105
+ String mapper = resolveAttribute ( "mapper" );
79
106
80
107
boolean hasMapper = StringUtils .hasText (mapper );
81
108
boolean hasDefaultPayloadExpression = StringUtils .hasText (defaultPayloadExpression );
@@ -86,31 +113,9 @@ protected void onInit() {
86
113
Assert .state (!hasMapper || !hasDefaultHeaders ,
87
114
"'defaultHeaders' are not allowed when a 'mapper' is provided" );
88
115
89
-
90
- String defaultRequestChannel =
91
- beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString ("defaultRequestChannel" ));
92
- if (StringUtils .hasText (defaultRequestChannel )) {
93
- setDefaultRequestChannelName (defaultRequestChannel );
94
- }
95
-
96
- String defaultReplyChannel =
97
- beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString ("defaultReplyChannel" ));
98
- if (StringUtils .hasText (defaultReplyChannel )) {
99
- setDefaultReplyChannelName (defaultReplyChannel );
100
- }
101
-
102
- String errorChannel = beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString ("errorChannel" ));
103
- if (StringUtils .hasText (errorChannel )) {
104
- setErrorChannelName (errorChannel );
105
- }
106
-
107
- String asyncExecutor = beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString ("asyncExecutor" ));
108
- if (asyncExecutor == null || AnnotationConstants .NULL .equals (asyncExecutor )) {
109
- setAsyncExecutor (null );
110
- }
111
- else if (StringUtils .hasText (asyncExecutor )) {
112
- setAsyncExecutor (beanFactory .getBean (asyncExecutor , Executor .class ));
113
- }
116
+ JavaUtils .INSTANCE
117
+ .acceptIfHasText (mapper ,
118
+ value -> setMapper (beanFactory .getBean (value , MethodArgsMessageMapper .class )));
114
119
115
120
if (hasDefaultHeaders || hasDefaultPayloadExpression ) {
116
121
GatewayMethodMetadata gatewayMethodMetadata = new GatewayMethodMetadata ();
@@ -119,46 +124,34 @@ else if (StringUtils.hasText(asyncExecutor)) {
119
124
gatewayMethodMetadata .setPayloadExpression (defaultPayloadExpression );
120
125
}
121
126
122
- Map <String , Expression > headerExpressions = new HashMap <>();
123
- for ( Map < String , Object > header : defaultHeaders ) {
124
- String headerValue = beanFactory .resolveEmbeddedValue ((String ) header .get ("value " ));
125
- boolean hasValue = StringUtils . hasText ( headerValue );
126
-
127
- String headerExpression = beanFactory . resolveEmbeddedValue (( String ) header . get ( "expression" ) );
127
+ Map <String , Expression > headerExpressions = Arrays . stream ( defaultHeaders )
128
+ . collect ( Collectors . toMap (
129
+ header -> beanFactory .resolveEmbeddedValue ((String ) header .get ("name " )),
130
+ header -> {
131
+ String headerValue = beanFactory . resolveEmbeddedValue (( String ) header . get ( "value" ));
132
+ boolean hasValue = StringUtils . hasText ( headerValue );
128
133
129
- Assert . state (!( hasValue == StringUtils . hasText ( headerExpression )),
130
- "exactly one of 'value' or 'expression' is required on a gateway's header." );
134
+ String headerExpression =
135
+ beanFactory . resolveEmbeddedValue (( String ) header .get ( "expression" ) );
131
136
132
- Expression expression = hasValue ?
133
- new LiteralExpression (headerValue ) :
134
- EXPRESSION_PARSER .parseExpression (headerExpression );
137
+ Assert .state (!(hasValue == StringUtils .hasText (headerExpression )),
138
+ "exactly one of 'value' or 'expression' is required on a gateway's header." );
135
139
136
- String headerName = beanFactory .resolveEmbeddedValue ((String ) header .get ("name" ));
137
- headerExpressions .put (headerName , expression );
138
- }
140
+ return hasValue ?
141
+ new LiteralExpression (headerValue ) :
142
+ EXPRESSION_PARSER .parseExpression (headerExpression );
143
+ }));
139
144
140
145
gatewayMethodMetadata .setHeaderExpressions (headerExpressions );
141
146
142
147
setGlobalMethodMetadata (gatewayMethodMetadata );
143
148
}
149
+ }
144
150
145
- if (StringUtils .hasText (mapper )) {
146
- setMapper (beanFactory .getBean (mapper , MethodArgsMessageMapper .class ));
147
- }
148
-
149
- String defaultRequestTimeout =
150
- beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString ("defaultRequestTimeout" ));
151
- if (StringUtils .hasText (defaultRequestTimeout )) {
152
- setDefaultRequestTimeout (Long .parseLong (defaultRequestTimeout ));
153
- }
154
-
155
- String defaultReplyTimeout =
156
- beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString ("defaultReplyTimeout" ));
157
- if (StringUtils .hasText (defaultReplyTimeout )) {
158
- setDefaultReplyTimeout (Long .parseLong (defaultReplyTimeout ));
159
- }
160
-
161
- super .onInit ();
151
+ @ Nullable
152
+ private String resolveAttribute (String attributeName ) {
153
+ ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory ) getBeanFactory ();
154
+ return beanFactory .resolveEmbeddedValue (this .gatewayAttributes .getString (attributeName ));
162
155
}
163
156
164
157
}
0 commit comments