0

I am using

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-integration</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-http</artifactId>
    </dependency>

I have this controller where I received a path variable and request body

@PatchMapping("/applications/{applicationId}/disclosure")
public void piSubmission(@PathVariable(value = "applicationId") String applicationId,
                         @RequestBody DisclosureInfo disclosureInfo) {

    disclosureGateway.process(applicationId, disclosureInfo);
    
}

I init the process using a gateway so I pass it the 2 values

@MessagingGateway
public interface DisclosureGateway {
    
    @Gateway(requestChannel = "disclosure")
    void process(String applicationId, DisclosureInfo disclosureInfo);
    
    
}

But I got the follow error

Caused by: java.lang.IllegalArgumentException: org.springframework.integration.handler.support.MessagingMethodInvokerHelper$IneligibleMethodException: Found more than one parameter type candidate: [java.lang.String] and [v3.b.engine.domain.kernel.DisclosureInfo]
at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.createHandlerMethod(MessagingMethodInvokerHelper.java:396)
at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.<init>(MessagingMethodInvokerHelper.java:255)
at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.<init>(MessagingMethodInvokerHelper.java:206)
at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.<init>(MessagingMethodInvokerHelper.java:210)
at org.springframework.integration.handler.MethodInvokingMessageProcessor.<init>(MethodInvokingMessageProcessor.java:50)
at org.springframework.integration.transformer.MethodInvokingTransformer.<init>(MethodInvokingTransformer.java:38)
at org.springframework.integration.config.annotation.TransformerAnnotationPostProcessor.createHandler(TransformerAnnotationPostProcessor.java:71)
at org.springframework.integration.config.annotation.AbstractMethodAnnotationPostProcessor.postProcess(AbstractMethodAnnotationPostProcessor.java:158)
at org.springframework.integration.config.annotation.MessagingAnnotationPostProcessor.postProcessMethodAndRegisterEndpointIfAny(MessagingAnnotationPostProcessor.java:230)
at org.springframework.integration.config.annotation.MessagingAnnotationPostProcessor.lambda$processAnnotationTypeOnMethod$1(MessagingAnnotationPostProcessor.java:220)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at org.springframework.integration.config.annotation.MessagingAnnotationPostProcessor.afterSingletonsInstantiated(MessagingAnnotationPostProcessor.java:141)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:963)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326)
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
... 67 more
Caused by: org.springframework.integration.handler.support.MessagingMethodInvokerHelper$IneligibleMethodException: Found more than one parameter type candidate: [java.lang.String] and [v3.b.engine.domain.kernel.DisclosureInfo]
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper$HandlerMethod.setExclusiveTargetParameterType(MessagingMethodInvokerHelper.java:1334)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper$HandlerMethod.processMethodParameterForExpression(MessagingMethodInvokerHelper.java:1199)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper$HandlerMethod.generateExpression(MessagingMethodInvokerHelper.java:1152)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper$HandlerMethod.<init>(MessagingMethodInvokerHelper.java:1091)
    at org.springframework.integration.handler.support.MessagingMethodInvokerHelper.createHandlerMethod(MessagingMethodInvokerHelper.java:391)

What I am missing?

4

1 回答 1

2

Please, make yourself more familiar with what is Messaging Gateway in Spring Integration: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway.

In two words: the gateway is an interface to send messages on its method calls.

The Message is like this:

public interface Message<T> {

    /**
     * Return the message payload.
     */
    T getPayload();

    /**
     * Return message headers for the message (never {@code null} but may be empty).
     */
    MessageHeaders getHeaders();

}

Since you don't have a Message type as one of your arguments, the framework doesn't know which of them to map to the payload of the message it is going to create.

Please, be sure what argument should go to the payload using a @Payload on it. And which one is going to be added to headers using a @Header annotation. All of that info is present in the docs I link in the beginning.

于 2021-03-01T20:01:01.687 回答