我正在使用WebSocket制作一个聊天应用程序。
这是我的Angular的代码,用于发送一个 MessageModel
对象转换为JSON字符串后传到后端。
sendMessage(message: MessageModel){
let data = JSON.stringify({
message: message
})
this.ws.send("/messaging/"+message.receiverId, {}, data); }
现在我的接收消息的Java代码是。
@MessageMapping("/messaging/{to}")
@SendTo("/inbox/coversation/{to}")
public String processMessageFromClient(@DestinationVariable String to, @Payload String message) throws Exception {
MessageModel msg = new MessageModel();
System.out.println(message);
msg = new Gson().fromJson(message, MessageModel.class);
System.out.println(msg);
return message;
}
System.out.println(message)的OUTPUT是::
{"message":{"messageText":"hey","senderId":4,"senderName":"Akash Malhotra","receiverId":1,"senderEmail":"[email protected]","sentTime":"15:19:43 GMT+0530 (India Standard Time)","date":"08/06/2020, 15:19:43"}}
和
System.out.println(msg)的输出是。
MessageModel [messageText=null, senderName=null, senderId=null, senderEmail=null, profilePicUrl=null, receiverId=null, sentTime=null, date=null]
问题:我正在寻找一种方法来设置从angular收到的 "String message "到java中的MessageModel对象,因为它显示的都是空值。
public class StackOverflow
{
public String processMessageFromClient( String to, String message ) throws Exception
{
System.out.println( message );
final MessageWrapper msg = new Gson().fromJson( message, MessageWrapper.class );
System.out.println( msg.message );
return message;
}
public static void main( String[] args ) throws Exception
{
final String jsonString = "{\"message\":{\"messageText\":\"hey\",\"senderId\":4,\"senderName\":\"Akash Malhotra\",\"receiverId\":1,\"senderEmail\":\"[email protected]\",\"sentTime\":\"15:19:43 GMT+0530 (India Standard Time)\",\"date\":\"08/06/2020, 15:19:43\"}}";
new StackOverflow().processMessageFromClient( "You", jsonString );
}
}
class MessageModel
{
String messageText;
String senderName;
Integer senderId;
String senderEmail;
String profilePicUrl;
Integer receiverId;
String sentTime;
String date;
@Override
public String toString()
{
// ... etc.
}
}
class MessageWrapper
{
MessageModel message;
}
JSON字符串包含另一个包装器,形式为:
{
"message" = { /* actual MessageModel contents */ }
}
由于MessageModel不包含一个字段。message
,没有设置字段,结果是 null
values.将MessageModel包装在另一个类中。MessageWrapper
该 是否 有田 message
类型 MessageModel
,使GSON能够递归地解码 MessageModel
.
在你的方法中传递MessageModel而不是String。Spring将尝试使用底层的jackson(或你为spring设置的自定义映射器)来使用MessageModel类将有效载荷映射到MessageModel对象。
@MessageMapping("/messaging/{to}")
@SendTo("/inbox/coversation/{to}")
public String processMessageFromClient(@DestinationVariable String to, @Payload MessageModel message) throws Exception {
...
}