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 для примера.