IneligibleMethodException: найдено более одного кандидата типа параметра - Spring Integration

Я использую

    <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>

У меня есть этот контроллер, где я получил переменную пути и тело запроса

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

    disclosureGateway.process(applicationId, disclosureInfo);
    
}

Я запускаю процесс с помощью шлюза, поэтому я передаю ему 2 значения

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

Но я получил следующую ошибку

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)

Что мне не хватает?


person TuGordoBello    schedule 01.03.2021    source источник


Ответы (1)


Пожалуйста, ознакомьтесь с тем, что такое Messaging Gateway в Spring Integration: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway.

В двух словах: шлюз — это интерфейс для отправки сообщений о вызовах его методов.

Message выглядит так:

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();

}

Поскольку у вас нет типа Message в качестве одного из ваших аргументов, фреймворк не знает, какой из них сопоставить с полезной нагрузкой сообщения, которое он собирается создать.

Пожалуйста, убедитесь, какой аргумент должен быть передан в полезную нагрузку, используя @Payload на нем. И какой из них будет добавлен в заголовки с помощью аннотации @Header. Вся эта информация присутствует в документах, на которые я ссылаюсь в начале.

person Artem Bilan    schedule 01.03.2021
comment
Вау, отличный ответ, я пропустил это. Спасибо - person TuGordoBello; 01.03.2021
comment
Вот некоторые исправления, чтобы сделать его более понятным: github.com/spring-projects/ пружинная интеграция/тянуть/3500 - person Artem Bilan; 03.03.2021