4040import org .springframework .messaging .Message ;
4141import org .springframework .messaging .MessageHeaders ;
4242import org .springframework .messaging .converter .MessageConverter ;
43- import org .springframework .messaging .handler .HandlerMethod ;
4443import org .springframework .messaging .handler .annotation .Header ;
4544import org .springframework .messaging .handler .annotation .SendTo ;
4645import org .springframework .messaging .handler .annotation .support .PayloadMethodArgumentResolver ;
@@ -75,6 +74,8 @@ public class DelegatingInvocableHandler {
7574
7675 private final Map <InvocableHandlerMethod , Boolean > handlerReturnsMessage = new ConcurrentHashMap <>();
7776
77+ private final Map <InvocableHandlerMethod , Boolean > handlerMetadataAware = new ConcurrentHashMap <>();
78+
7879 private final Object bean ;
7980
8081 private final BeanExpressionResolver resolver ;
@@ -137,11 +138,12 @@ public DelegatingInvocableHandler(List<InvocableHandlerMethod> handlers,
137138 @ Nullable BeanExpressionContext beanExpressionContext ,
138139 @ Nullable BeanFactory beanFactory , @ Nullable Validator validator ) {
139140
140- this .handlers = new ArrayList <>();
141+ this .handlers = new ArrayList <>(handlers );
141142 for (InvocableHandlerMethod handler : handlers ) {
142- this . handlers . add ( wrapIfNecessary ( handler ) );
143+ checkSpecial ( handler );
143144 }
144- this .defaultHandler = wrapIfNecessary (defaultHandler );
145+ this .defaultHandler = defaultHandler ;
146+ checkSpecial (defaultHandler );
145147 this .bean = bean ;
146148 this .resolver = beanExpressionResolver ;
147149 this .beanExpressionContext = beanExpressionContext ;
@@ -151,18 +153,17 @@ public DelegatingInvocableHandler(List<InvocableHandlerMethod> handlers,
151153 this .validator = validator == null ? null : new PayloadValidator (validator );
152154 }
153155
154- @ Nullable
155- private InvocableHandlerMethod wrapIfNecessary (@ Nullable InvocableHandlerMethod handler ) {
156+ private void checkSpecial (@ Nullable InvocableHandlerMethod handler ) {
156157 if (handler == null ) {
157- return null ;
158+ return ;
158159 }
159160 Parameter [] parameters = handler .getMethod ().getParameters ();
160161 for (Parameter parameter : parameters ) {
161162 if (parameter .getType ().equals (ConsumerRecordMetadata .class )) {
162- return new DelegatingInvocableHandler .MetadataAwareInvocableHandlerMethod (handler );
163+ this .handlerMetadataAware .put (handler , true );
164+ return ;
163165 }
164166 }
165- return handler ;
166167 }
167168
168169 /**
@@ -191,7 +192,7 @@ public Object invoke(Message<?> message, Object... providedArgs) throws Exceptio
191192 }
192193 }
193194 Object result ;
194- if (handler instanceof MetadataAwareInvocableHandlerMethod ) {
195+ if (Boolean . TRUE . equals ( this . handlerMetadataAware . get ( handler )) ) {
195196 Object [] args = new Object [providedArgs .length + 1 ];
196197 args [0 ] = AdapterUtils .buildConsumerRecordMetadataFromArray (providedArgs );
197198 System .arraycopy (providedArgs , 0 , args , 1 , providedArgs .length );
@@ -350,19 +351,6 @@ public boolean hasDefaultHandler() {
350351 return this .defaultHandler != null ;
351352 }
352353
353- /**
354- * A handler method that is aware of {@link ConsumerRecordMetadata}.
355- *
356- * @since 2.5
357- */
358- private static final class MetadataAwareInvocableHandlerMethod extends InvocableHandlerMethod {
359-
360- MetadataAwareInvocableHandlerMethod (HandlerMethod handlerMethod ) {
361- super (handlerMethod );
362- }
363-
364- }
365-
366354 private static final class PayloadValidator extends PayloadMethodArgumentResolver {
367355
368356 PayloadValidator (Validator validator ) {
0 commit comments