Spring websocket: como converter facilmente a carga útil da Message <?> Para POJO no ChannelInterceptorAdapter
Eu tenho um aplicativo Spring trabalhando com websocket
Eu posso fazer a conexão e enviar mensagens etc.
o@Controller
é:
@MessageMapping("/ws/notification")
@SendTo("/topic/springframework.topic.websocket.reply")
public NotificationReply handleNotification(Notification notification) {
...
}
Funciona bem. Observe o tipo de parâmetro,Notification
, é um objeto personalizado.
Agora, porque para fins de auditoria, tenho o seguinte:
@Component
public class MessageChannelInterceptorAdapter extends ChannelInterceptorAdapter {
@Override
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
StompHeaderAccessor stompHeaderAccessor = StompHeaderAccessor.wrap(message);
....
switch(stompHeaderAccessor.getCommand()) {
case CONNECT:
logger.info("postSend ...");
logger.info("STOMP Connect");
break;
...
case SEND:
logger.info("postSend ...");
logger.info("STOMP Send");
printDetails(message, stompHeaderAccessor);
break;
...
}
private void printDetails(Message<?> message, StompHeaderAccessor stompHeaderAccessor) {
logger.info(" {}", message.toString());
logger.info(" Payload: {}", message.getPayload());
logger.info(" Payload (String): {}", message.getPayload().toString());
logger.info(" Payload (Class): {}", message.getPayload().getClass());
if(stompHeaderAccessor.getDestination()!=null && stompHeaderAccessor.getDestination().equals("/app/ws/notification")) {
logger.info("Aprrrr");
Notification notification = (Notification) message.getPayload();
logger.info("{}", notification);
}
Eu recebo:
ERROR o.s.w.s.m.StompSubProtocolHandler -
Failed to send client message to application via MessageChannel in session 555qe12a.
Sending STOMP ERROR to client.
org.springframework.messaging.MessageDeliveryException:
Failed to send message to ExecutorSubscribableChannel[clientInboundChannel];
nested exception is java.lang.ClassCastException:
[B cannot be cast to com.manuel.jordan.websocket.message.Notification
Eu entendi aquilo[B
é umbyte[]
.
Assim, existe uma maneira fácil com o atualSpring Framework
API para fazer uma transmissão para oMessage<?>
carga útil para um POJO específico ?.
Lembre-se de ser aplicado dentro da classe que está se estendendo deChannelInterceptorAdapter