Http Spring Integration с Spring Boot и @RequestMapping

Я пытаюсь разработать SpringBoot Rest Server с помощью Spring Integration HTTP -> inboundGateway.

У меня есть контроллер, помеченный как "@Controller" и "@RequestMapping", и я пытаюсь создать следующий поток:

GET Request "/" -> Канал: httpRequestChannel -> Запустить IndexController -> Канал: httpReplyChannel -> вернуться в браузер

Но это не работает.

Моя интеграция Xml:

<int:channel id="httpRequestChannel">
  <int:interceptors>
    <int:wire-tap channel="logHttpRequestChannel" />
  </int:interceptors>
</int:channel>

<int:channel id="httpReplyChannel">
  <int:interceptors>
    <int:wire-tap channel="logHttpReplyChannel" />
  </int:interceptors>
</int:channel>

<int:logging-channel-adapter id="logHttpRequestChannel" level="INFO" logger-name="httpRequestChannel" log-full-message="true" />

<int:logging-channel-adapter id="logHttpReplyChannel" level="INFO" logger-name="httpReplyChannel" log-full-message="true" />

<int-http:inbound-gateway id="inboundGateway"
    request-channel="httpRequestChannel" reply-channel="httpReplyChannel"
    auto-startup="true" supported-methods="GET" path="/">
    <int-http:request-mapping produces="application/json" />
</int-http:inbound-gateway>

Ошибка:

Dispatcher has no subscribers

Но, на мой взгляд, контроллер должен быть подписчиком через аннотацию RequestMapping...

Я загружаю пример проекта GitHub: https://github.com/marcelalburg/spring-boot-integration-rest-server

Спасибо за помощь Марсель

ОБНОВИТЬ

Привет,

я вижу что-то в документации:

При синтаксическом анализе входящего шлюза HTTP или адаптера входящего канала HTTP регистрируется bean-компонент IntegrationRequestMappingHandlerMapping типа IntegrationRequestMappingHandlerMapping, если он еще не зарегистрирован. Эта конкретная реализация HandlerMapping делегирует свою логику RequestMappingInfoHandlerMapping. Реализация обеспечивает функциональность, аналогичную той, которая предоставляется аннотацией org.springframework.web.bind.annotation.RequestMapping в Spring MVC.

Итак, я изменил следующее:

    <int-http:inbound-gateway id="indexGateway"
    request-channel="httpRequestChannel" reply-channel="httpReplyChannel"
    auto-startup="true" supported-methods="GET" path="/, /test" reply-timeout="100" />

и мой контроллер

@ServiceActivator( inputChannel = "httpRequestChannel", outputChannel = "httpReplyChannel" )
@RequestMapping( value = "/", method = RequestMethod.GET, produces = "application/json" )
public String testGateway( LinkedMultiValueMap payload, @Headers Map<String, Object> headerMap )
{
    // IntegrationRequestMappingHandlerMapping

    System.out.println( "Starting process the message [reciveing]" );

    return "{HelloMessage: \"Hello\"}";
}

@ServiceActivator( inputChannel = "httpRequestChannel", outputChannel = "httpReplyChannel" )
@RequestMapping( value = "/test", method = RequestMethod.GET, produces = "application/json" )
public String testGateway2( LinkedMultiValueMap payload, @Headers Map<String, Object> headerMap )
{
    // IntegrationRequestMappingHandlerMapping

    System.out.println( "Starting process the message [reciveing]" );

    return "{HelloMessage: \"Test\"}";
}

Теперь я получаю ответ, но он возвращает рандомизированные "Тест" и "Привет" ...

Спасибо

1 ответ

Решение

Нет; у вас, похоже, есть основное недоразумение.

В Spring Integration входящий шлюз заменяет @Controllerи отправляет входящий (возможно, преобразованный) объект в качестве полезной нагрузки сообщения requestChannel,

Какой-то другой компонент (не контроллер) подписывается на этот канал для получения сообщения.

Таким образом, вместо настройки @Controller Вы можете настроить свой POJO как <service-activator input-channel="httpRequestChannel" .../> или аннотировать метод как @ServiceActivator,

Затем он будет использовать сообщение и, при необходимости, отправит ответ на выходной канал (пропуск выходного канала приведет к его перенаправлению обратно на шлюз).

Смотрите пример http для примера.

Другие вопросы по тегам