2017-03-03 4 views
0

스프링 웹 소켓을 사용하고 있습니다. 잘 작동하지만 메시지가 웹 클라이언트에 전송되기 전에 메시지를 수정해야하는 경우가 있습니다. 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이
  • 타임 스탬프

나에게 알려지지 않은 이유로 웹 클라이언트가 메시지를받지 못했습니다.