|
1 | 1 | /*
|
2 |
| - * Copyright 2021 the original author or authors. |
| 2 | + * Copyright 2022 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
14 | 14 | * limitations under the License.
|
15 | 15 | */
|
16 | 16 |
|
17 |
| -package org.springframework.integration.config; |
| 17 | +package org.springframework.integration.handler.support; |
18 | 18 |
|
| 19 | +import java.lang.reflect.Method; |
19 | 20 | import java.util.ArrayList;
|
20 | 21 | import java.util.List;
|
21 | 22 |
|
22 |
| -import org.springframework.beans.BeansException; |
23 | 23 | import org.springframework.beans.factory.BeanFactory;
|
24 | 24 | import org.springframework.beans.factory.BeanFactoryAware;
|
25 | 25 | import org.springframework.beans.factory.BeanInitializationException;
|
26 |
| -import org.springframework.beans.factory.FactoryBean; |
27 | 26 | import org.springframework.beans.factory.InitializingBean;
|
28 |
| -import org.springframework.integration.handler.support.CollectionArgumentResolver; |
29 |
| -import org.springframework.integration.handler.support.MapArgumentResolver; |
30 |
| -import org.springframework.integration.handler.support.PayloadExpressionArgumentResolver; |
31 |
| -import org.springframework.integration.handler.support.PayloadsArgumentResolver; |
32 | 27 | import org.springframework.integration.support.NullAwarePayloadArgumentResolver;
|
33 | 28 | import org.springframework.messaging.converter.MessageConverter;
|
34 | 29 | import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;
|
35 |
| -import org.springframework.messaging.handler.annotation.support.MessageHandlerMethodFactory; |
36 | 30 | import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
|
| 31 | +import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite; |
| 32 | +import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; |
37 | 33 |
|
38 | 34 | /**
|
39 |
| - * The {@link FactoryBean} for creating integration-specific {@link MessageHandlerMethodFactory} instance. |
40 |
| - * It adds these custom {@link HandlerMethodArgumentResolver}s in the order: |
41 |
| - * <ul> |
42 |
| - * <li>{@link PayloadExpressionArgumentResolver}; |
43 |
| - * <li>{@link NullAwarePayloadArgumentResolver}; |
44 |
| - * <li>{@link PayloadsArgumentResolver}; |
45 |
| - * <li>{@link CollectionArgumentResolver} if {@link #listCapable} is true; |
46 |
| - * <li>{@link MapArgumentResolver}. |
47 |
| - * </ul> |
| 35 | + * Extension of the {@link DefaultMessageHandlerMethodFactory} for Spring Integration requirements. |
48 | 36 | *
|
49 |
| - * @author Artyem Bilan |
| 37 | + * @author Artem Bilan |
50 | 38 | *
|
51 |
| - * @since 5.5.7 |
| 39 | + * @since 6.0 |
52 | 40 | */
|
53 |
| -class MessageHandlerMethodFactoryCreatingFactoryBean |
54 |
| - implements FactoryBean<MessageHandlerMethodFactory>, BeanFactoryAware { |
| 41 | +public class IntegrationMessageHandlerMethodFactory extends DefaultMessageHandlerMethodFactory { |
| 42 | + |
| 43 | + private final HandlerMethodArgumentResolverComposite argumentResolvers = |
| 44 | + new HandlerMethodArgumentResolverComposite(); |
55 | 45 |
|
56 | 46 | private final boolean listCapable;
|
57 | 47 |
|
58 |
| - private MessageConverter argumentResolverMessageConverter; |
| 48 | + private MessageConverter messageConverter; |
59 | 49 |
|
60 | 50 | private BeanFactory beanFactory;
|
61 | 51 |
|
62 |
| - MessageHandlerMethodFactoryCreatingFactoryBean(boolean listCapable) { |
| 52 | + public IntegrationMessageHandlerMethodFactory() { |
| 53 | + this(false); |
| 54 | + } |
| 55 | + |
| 56 | + public IntegrationMessageHandlerMethodFactory(boolean listCapable) { |
63 | 57 | this.listCapable = listCapable;
|
64 | 58 | }
|
65 | 59 |
|
66 |
| - public void setArgumentResolverMessageConverter(MessageConverter argumentResolverMessageConverter) { |
67 |
| - this.argumentResolverMessageConverter = argumentResolverMessageConverter; |
| 60 | + @Override |
| 61 | + public void setMessageConverter(MessageConverter messageConverter) { |
| 62 | + super.setMessageConverter(messageConverter); |
| 63 | + this.messageConverter = messageConverter; |
68 | 64 | }
|
69 | 65 |
|
70 | 66 | @Override
|
71 |
| - public void setBeanFactory(BeanFactory beanFactory) throws BeansException { |
| 67 | + public void setBeanFactory(BeanFactory beanFactory) { |
| 68 | + super.setBeanFactory(beanFactory); |
72 | 69 | this.beanFactory = beanFactory;
|
73 | 70 | }
|
74 | 71 |
|
75 | 72 | @Override
|
76 |
| - public Class<?> getObjectType() { |
77 |
| - return MessageHandlerMethodFactory.class; |
| 73 | + public void afterPropertiesSet() { |
| 74 | + setCustomArgumentResolvers(buildArgumentResolvers(this.listCapable)); |
| 75 | + super.afterPropertiesSet(); |
78 | 76 | }
|
79 | 77 |
|
80 | 78 | @Override
|
81 |
| - public MessageHandlerMethodFactory getObject() { |
82 |
| - DefaultMessageHandlerMethodFactory handlerMethodFactory = new DefaultMessageHandlerMethodFactory(); |
83 |
| - handlerMethodFactory.setBeanFactory(this.beanFactory); |
84 |
| - handlerMethodFactory.setMessageConverter(this.argumentResolverMessageConverter); |
85 |
| - handlerMethodFactory.setCustomArgumentResolvers(buildArgumentResolvers(this.listCapable)); |
86 |
| - handlerMethodFactory.afterPropertiesSet(); |
87 |
| - return handlerMethodFactory; |
| 79 | + protected List<HandlerMethodArgumentResolver> initArgumentResolvers() { |
| 80 | + List<HandlerMethodArgumentResolver> resolvers = super.initArgumentResolvers(); |
| 81 | + this.argumentResolvers.addResolvers(resolvers); |
| 82 | + return resolvers; |
| 83 | + } |
| 84 | + |
| 85 | + @Override |
| 86 | + public InvocableHandlerMethod createInvocableHandlerMethod(Object bean, Method method) { |
| 87 | + InvocableHandlerMethod handlerMethod = new IntegrationInvocableHandlerMethod(bean, method); |
| 88 | + handlerMethod.setMessageMethodArgumentResolvers(this.argumentResolvers); |
| 89 | + return handlerMethod; |
88 | 90 | }
|
89 | 91 |
|
90 | 92 | private List<HandlerMethodArgumentResolver> buildArgumentResolvers(boolean listCapable) {
|
91 | 93 | List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
|
92 | 94 | resolvers.add(new PayloadExpressionArgumentResolver());
|
93 |
| - resolvers.add(new NullAwarePayloadArgumentResolver(this.argumentResolverMessageConverter)); |
| 95 | + resolvers.add(new NullAwarePayloadArgumentResolver(this.messageConverter)); |
94 | 96 | resolvers.add(new PayloadsArgumentResolver());
|
95 | 97 | if (listCapable) {
|
96 | 98 | resolvers.add(new CollectionArgumentResolver(true));
|
97 | 99 | }
|
98 | 100 | resolvers.add(new MapArgumentResolver());
|
| 101 | + resolvers.add(new ContinuationHandlerMethodArgumentResolver()); |
| 102 | + |
99 | 103 | for (HandlerMethodArgumentResolver resolver : resolvers) {
|
100 | 104 | if (resolver instanceof BeanFactoryAware) {
|
101 | 105 | ((BeanFactoryAware) resolver).setBeanFactory(this.beanFactory);
|
|
0 commit comments