Spring websocket: ¿cómo convertir fácilmente la carga útil del mensaje <?> A POJO en ChannelInterceptorAdapter
Tengo una aplicación Spring trabajando con websocket
Puedo hacer la conexión y enviar mensajes, etc.
Los@Controller
es
@MessageMapping("/ws/notification")
@SendTo("/topic/springframework.topic.websocket.reply")
public NotificationReply handleNotification(Notification notification) {
...
}
Funciona bien. Observe el tipo de parámetro,Notification
, es un objeto personalizado.
Ahora porque para fines de auditoría tengo lo siguiente:
@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);
}
Yo obtengo
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
Entiendo que[B
es unbyte[]
.
Así existe una manera fácil con la @ actuSpring Framework
API para hacer un reparto para laMessage<?>
carga útil a un POJO específico?.
Recuerde que se aplicará dentro de la clase que se extiende desdeChannelInterceptorAdapter