如何在 spring 中设置从 java 中的 Angular 对象中获得的 JSON 字符串
How to set JSON string obtained from Angular in java Object in spring
我正在使用 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":{"messageText":"hey","senderId":4,"senderName":"Akash Malhotra","receiverId":1,"senderEmail":"aku@gmail.com","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 对象,因为它显示所有空值。
TL/DR 这有效
public class Whosebug
{
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\":\"aku@gmail.com\",\"sentTime\":\"15:19:43 GMT+0530 (India Standard Time)\",\"date\":\"08/06/2020, 15:19:43\"}}";
new Whosebug().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
值。
将 MessageModel 包装在另一个 class MessageWrapper
中 确实 具有类型 MessageModel
的字段 message
,允许 GSON 递归解码 MessageModel
.
在您的方法中传递 MessageModel 而不是 String。 Spring 将尝试使用底层 jackson(或您为 spring 使用的自定义映射器)使用 MessageModel class.
将有效负载映射到 MessageModel 对象
@MessageMapping("/messaging/{to}")
@SendTo("/inbox/coversation/{to}")
public String processMessageFromClient(@DestinationVariable String to, @Payload MessageModel message) throws Exception {
...
}
我正在使用 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":{"messageText":"hey","senderId":4,"senderName":"Akash Malhotra","receiverId":1,"senderEmail":"aku@gmail.com","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 对象,因为它显示所有空值。
TL/DR 这有效
public class Whosebug
{
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\":\"aku@gmail.com\",\"sentTime\":\"15:19:43 GMT+0530 (India Standard Time)\",\"date\":\"08/06/2020, 15:19:43\"}}";
new Whosebug().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
值。
将 MessageModel 包装在另一个 class MessageWrapper
中 确实 具有类型 MessageModel
的字段 message
,允许 GSON 递归解码 MessageModel
.
在您的方法中传递 MessageModel 而不是 String。 Spring 将尝试使用底层 jackson(或您为 spring 使用的自定义映射器)使用 MessageModel class.
将有效负载映射到 MessageModel 对象@MessageMapping("/messaging/{to}")
@SendTo("/inbox/coversation/{to}")
public String processMessageFromClient(@DestinationVariable String to, @Payload MessageModel message) throws Exception {
...
}