2015-07-28 2 views
2

Наши клиенты веб-сайта javascript добавляют «пользовательские» заголовки ко всем сообщениям STOMP.
Мой проект обрабатывает конечные точки websocket, используя spring-websocket @Controller.Лучший способ автоматического добавления заголовков stomp в заголовки

@MessageMapping(value = "/mymessages") 
public void save(@Payload ToBeSaved payload, @Headers MessageHeaders headers) { 
    service.save(toMsg(payload, headers)); 
} 

protected <P> Message<P> toMsg(P payload, MessageHeaders headers) { 
    return MessageBuilder.createMessage(payload, headers); 
} 

Контроллер изменяет полезную нагрузку, а затем передает новую полезную нагрузку и оригинальные WebSocket заголовки (в том числе пользовательских единиц) к весенне-интеграции @MessagingGateway.

Основание IntegrationFlow пытается получить доступ к «настраиваемым» заголовкам, обратившись к заголовкам сообщений с помощью SPLExpression headers['custom'].
К сожалению, headers['custom'] всегда имеет значение null, так как custom фактически содержится в nativeHeaders.

Я не нашел способ рассказать IntegrationFlow посмотреть в nativeHeaders.

Есть ли способ в spring-websocket скопировать все родные заголовки как обычные заголовки?

Заранее спасибо

ответ

2

весна-WebSocket ничего не может сделать для вашего по этому вопросу. Это не его ответственность.

Если вы действительно хотите получить доступ к коду в nativeHeaders, вам следует сделать это вручную.

Для вашего конкретного случая, что SPEL может выглядеть как:

headers['nativeHeaders']['custom'] 

nativeHeaders Поскольку это Map, а также.

С другой стороны вы можете использовать <header-enricher> в потоке вниз, чтобы вытащить все эти nativeHeaders на верхний уровень.

И еще один момент: с весенней интеграцией 4.2 мы предоставляем встроенную поддержку адаптеров STOMP. И есть StompHeaderMapper, который делает именно то, что вы хотите, и код там выглядит следующим образом:

else if (StompHeaderAccessor.NATIVE_HEADERS.equals(name)) { 
      MultiValueMap<String, String> multiValueMap = 
        headers.get(StompHeaderAccessor.NATIVE_HEADERS, MultiValueMap.class); 
      for (Map.Entry<String, List<String>> entry1 : multiValueMap.entrySet()) { 
       name = entry1.getKey(); 
       if (shouldMapHeader(name, this.outboundHeaderNames)) { 
        String value = entry1.getValue().get(0); 
        if (StringUtils.hasText(value)) { 
         setStompHeader(target, name, value); 
        } 
       } 
      } 
     } 
+0

Спасибо, я не пробовал 'заголовки [«nativeHeaders»] [«заказ»] ', но еще будет в будущем , – paskos