
[英]Can't send object via Object Output Stream from one http handler to another
[英]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.