2017-12-09 8 views
0

So versuche ich ein Objekt von Client-> Server & Server-> Client mit WebSocket zu senden. Sende Objekt von client-> Server funktionieren gut, mittlerweile server-> Clientkann Objekt über Websocket nicht senden

org.springframework.messaging.converter.MessageConversionException eine Ausnahme auslösen: Kann nicht JSON lesen: nicht Instanz von java.lang.String deserialisieren Kann aus von START_OBJECT Token

Hier wird die Klasse versuche ich

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

und dies ist der Code auf der Client-Seite

senden
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); 
    } 
} 

und dies ist Nachricht Controller auf der serverseitigen

@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"); 
    } 
} 

ich in der Lage war System.out.printin laufen ("Meldung:" + message.toString());, aber Nachrichtenkonvertierungsausnahme auf der Client-Seite erhalten, wenn neue TextMessage zurückgegeben wird ("test2", "test2", "test2");. Von meinem Test zuvor funktioniert die Rückgabe eines String-Objekts gut, warum funktioniert das zurückgegebene TextMessage-Objekt nicht? Wie kann ich irgendein Objekt (in diesem Fall TextMessage) von Server-> Client senden? Vielen Dank!

Antwort

1

Nun, das Problem ist der Inhalt. In dieser Zeile:

stompClient.setMessageConverter(new MappingJackson2MessageConverter()); 

Sie geben an, dass der Client einen JSON-Konverter verwendet. Daher erwartet Ihr Client immer ein JSON-Objekt.

Aber in Ihrem Test in dieser Zeile:

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

Sie senden Klartext. Durch die StompClient eine Ausnahme ausgelöst wird

org.springframework.messaging.converter.MessageConversionException

Da die Nachricht in Textebene ist nicht JSON-Objekt.

Verwandte Themen