2014-12-24 2 views
2

У меня есть маршрутизатор значения заголовка для кода состояния http на канале ответа. Я хочу перенаправить на исходную полезную нагрузку до afterSuccessChannel, если код состояния 200 else, если какой-либо другой статус находится в заголовке. Я хочу отправить полезную нагрузку в afterFailuerChannel. Я не уверен, что это возможно с header-value-router, так как нет поля выражения. Возможно ли это с header-value-router, или для этого мне нужно использовать родовой маршрутизатор?Роутер значения интеграции заголовка Spring с условием

<int:header-value-router header-name="#{T(org.springframework.integration.http.HttpHeaders).STATUS_CODE}" input-channel="ccChannel" default-output-channel="ccLogger"> 
     <int:mapping value="200" channel="afterSuccessChannel"/> 
</int:header-value-router> 

Кроме того, я получаю следующее сообщение об ошибке при использовании маршрутизатора выше, даже если я получаю http_statusCode=200 на заголовок сообщения:

ErrorMessage [payload=org.springframework.messaging.MessagingException: failed to resolve channel name 'OK'; nested exception is org.springframework.messaging.core.DestinationResolutionException: failed to look up MessageChannel with name 'OK' in the BeanFactory.; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'OK' is defined, headers={timestamp=1419419964606, id=eea83b65-0e72-bcda-d8fe-6d9bb4619fb4, history=errorChannel}] 

Я не знаю, почему он ищет OK канала.

ответ

2

Заголовок представляет собой объект (перечисление) HttpStatus, а не простую строку.

Вам необходимо отобразить на перечисление (в данном случае OK)

<int:mapping value="OK" channel="afterSuccessChannel"/> 

EDIT:

Для того, чтобы отбрасывать не-матчи, вы должны установить resolution-required="false".

Любой из этих работ ...

<int:header-value-router input-channel="foo" default-output-channel="baz" 
    resolution-required="false" 
    header-name="#{T(org.springframework.integration.http.HttpHeaders).STATUS_CODE}"> 
    <int:mapping value="OK" channel="bar" /> 
</int:header-value-router> 


<int:router input-channel="foo" default-output-channel="baz" 
    resolution-required="false" 
    expression="headers['#{T(org.springframework.integration.http.HttpHeaders).STATUS_CODE}'].toString()"> 
    <int:mapping value="200" channel="bar" /> 
</int:router> 

Обратите внимание, что второй один регулярный маршрутизатор, который использует выражение времени выполнения для извлечения числового значения заголовка.

+0

Отлично. У меня есть один вопрос. Будет ли этот маршрутизатор условным? Условный в том смысле, что если значение не 'OK', будет ли оно маршрутизироваться на' default-output-channel'? – nebula

+0

На самом деле, у меня есть условие для перехода на 'afterSuccessChannel', значение статуса равно 200/OK, иначе маршрут в' ccLogger'. – nebula

+0

Используйте 'resolution-required =" false "' - Я обновил ответ. –

Смежные вопросы