繁体   English   中英

无法通过 websocket 发送对象

[英]can't send object via websocket

所以我正在尝试使用 WebSocket 从客户端-> 服务器和服务器-> 客户端发送一个对象。 从客户端发送对象->服务器工作正常,同时服务器->客户端抛出异常

org.springframework.messaging.converter.MessageConversionException:无法读取 JSON:无法从 START_OBJECT 令牌中反序列化 java.lang.String 的实例

这是我要发送的课程

@Data
@AllArgsConstructor
@NoArgsConstructor
    public class TextMessage {
    private String sender;
    private String room;
    private String message;
}

这是客户端的代码

public class TelepatiClient {
    public static void main(String[] args) {
        WebSocketClient client = new StandardWebSocketClient();
        WebSocketStompClient stompClient = new WebSocketStompClient(client);
        stompClient.setMessageConverter(new MappingJackson2MessageConverter());
        stompClient.setTaskScheduler(new ConcurrentTaskScheduler());
        String url = "ws://localhost:8000/connect";
        StompSessionHandler handler = new TelepatiSessionHandler();
        stompClient.connect(url, handler);
        new Scanner(System.in).nextLine();
    }
}

public class TelepatiSessionHandler extends StompSessionHandlerAdapter {
    @Override
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
        session.subscribe("/room/global", this);
        session.send("/test", new TextMessage("test", "test", "test"));
    }
    @Override
    public void handleFrame(StompHeaders headers, Object payload) {
        System.out.println(payload.toString());
    }
    @Override
    public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
        exception.printStackTrace();
        super.handleException(session, command, headers, payload, exception);
    }
}

这是服务器端的消息控制器

@Controller
public class TelepatiController {
    @MessageMapping("/test")
    @SendTo("/room/global")
    public TextMessage getMessage(TextMessage message) {
        System.out.println("get message :" + message.toString());
        return new TextMessage("test2", "test2", "test2");
    }
}

我能够运行System.out.println("get message :" + message.toString()); , 但在客户端返回时得到消息转换异常new TextMessage("test2", "test2", "test2"); . 从我之前的测试中,返回 String 对象工作正常,为什么返回 TextMessage 对象不起作用? 如何从服务器-> 客户端发送任何对象(在本例中为 TextMessage)? 谢谢!

那么问题是内容。 在这一行:

stompClient.setMessageConverter(new MappingJackson2MessageConverter());

您指出客户端使用 json 转换器。 所以,你的客户总是期待一个 JSON 对象。

但是在您的测试中,在这一行中:

 return new TextMessage("test2", "test2", "test2");

您正在发送纯文本。 由于 StompClient 抛出异常

org.springframework.messaging.converter.MessageConversionException

因为纯文本中的消息不是 JSON 对象。

我希望有人能帮助你,我遇到了同样的问题,我所做的是告诉我订阅的 topler 处理程序,将返回的有效负载类型。

这是我的 stompClient 的处理程序:

public class TelepatiSessionHandler extends StompSessionHandlerAdapter {
    @Override
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
        session.send("/test", new TextMessage("test", "test", "test"));
    }
    @Override
    public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
        exception.printStackTrace();
        super.handleException(session, command, headers, payload, exception);
    }
}

这是我订阅的主题的处理程序

  WebSocketClient client = new StandardWebSocketClient();
  WebSocketStompClient stompClient = new WebSocketStompClient(client);
  stompClient.setMessageConverter(new MappingJackson2MessageConverter());
  stompClient.setTaskScheduler(new ConcurrentTaskScheduler());
  String url = "ws://localhost:8000/connect";
  StompSessionHandler handler = new TelepatiSessionHandler();
  StompSession session =  stompClient.connect(url, handler).get();
  session.subscribe("/room/global", new StompFrameHandler() {

      @Override
      public Type getPayloadType(StompHeaders headers) {
             return TextMessage.class;
      }

      @Override
      public void handleFrame(StompHeaders headers, Object payload) {
              TextMessage textMessage = (TextMessage) payload;
          System.out.println(textMessage.toString());
      }
  });

这是一个完整的例子: https : //github.com/jaysridhar/spring-websocket-client/blob/master/src/main/java/sample/Application.java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM