2017-03-03 125 views
0

我正在使用Spring WebSockets。它運行良好,但我現在有一種情況,在發送到Web客戶端之前需要修改消息。Stomp攔截器不工作

因此,我創建了以下攔截器:

@Component 
public class StompMappingInterceptor extends ChannelInterceptorAdapter { 

    @Override 
    public Message<?> preSend(Message<?> message, MessageChannel channel) { 
     message = MessageBuilder.withPayload(modifyMessage(message)) 
       .copyHeaders(message.getHeaders()) 
       .build(); 
     return message; 
    ... 
} 

modifyMessage()應該使用MappingJackson2MessageConverter,但是出於測試,我不是在所有修改的消息:

private Message<?> modifyMessage(Message<?> message) { 
    return message; 
} 

然而,消息是永遠在Webclient上收到。

當我改變preSend()方法:

@Override 
public Message<?> preSend(Message<?> message, MessageChannel channel) { 
    return message; 
} 

然後它工作得很好,所以這似乎是我的preSend()方法的一個問題,我創建一個新的消息的方式。我究竟做錯了什麼?

回答

1

必須按如下方式創建新的消息:

@Override 
public Message<?> preSend(Message<?> message, MessageChannel channel) { 

    Message<?> newMessage = MessageBuilder.createMessage(modifyMessage(message), 
    headerAccessor.getMessageHeaders()); 
    return message; 
    ... 
} 

不同的是,這樣一來,消息頭不包含以下字段:

  • ID
  • 的contentType
  • 時間戳

由於某種原因我不知道,這阻止了Web客戶端收到消息。