首页 > 解决方案 > 无法读取 JSON:无法构造 `org.club.entities.User` 的实例

问题描述

我试图通过 webSocket 制作一个带有角度(前端)和 Java Springboot 的聊天应用程序,

我的工作场景 有两个实体,第一个是 userEntity,第二个是 messageEntity,它们之间有 OneToMany 关系(用户是 One)和(消息是很多)。让我向您展示我的两个实体:

用户实体

public class User  {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
.
.
.
.
@JsonIgnore
@OneToMany(mappedBy = "Recievername")
private List<ChatMessage> Recievername;
@JsonIgnore
@OneToMany(mappedBy = "Sendername")
private List<ChatMessage> Sendername;
}

消息实体

public class ChatMessage {
    
@Id  @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String text;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "Recievername", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private User Recievername;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "Sendername", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private User Sendername;
private String avatar;
}

然后这是我的 Message MessageCon的控制器

@Controller 
public class ChatController {
 // mapped to handle chat messages to the /sendmsg destination
    @Autowired
    private ChatMessageRepo chat;
    
 @MessageMapping("/sendmsg")
 // the return value is broadcast to all subscribers of /chat/messages
 @SendTo("/chat/messages")
 public ChatMessage chat(ChatMessage message) throws Exception {
     Thread.sleep(1000); // simulated delay
     return chat.save( new ChatMessage(message.getId() , message.getText(), message.getRecievername(), message.getAvatar(), message.getSendername()));
 }
}

当我从前面发送消息时,Eclipse 的控制台会显示我发送的消息,但也出现此错误:

Could not read JSON: Cannot construct instance of `org.club.entities.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('mohamed')

堆栈跟踪

Could not read JSON: Cannot construct instance of `org.club.entities.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('mohamed')
 at [Source: (byte[])"{"text":"azaz","avatar":"","Sendername":"ADMIN","recievername":"mohamed"}"; line: 1, column: 64] (through reference chain: org.club.entities.ChatMessage["recievername"]); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `org.club.entities.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('mohamed')
 at [Source: (byte[])"{"text":"azaz","avatar":"","Sendername":"ADMIN","recievername":"mohamed"}"; line: 1, column: 64] (through reference chain: org.club.entities.ChatMessage["recievername"])
    at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertFromInternal(MappingJackson2MessageConverter.java:234) ~[spring-messaging-5.0.7.RELEASE.jar:5.0.7.RELEASE]

at java.lang.Thread.run(Thread.java:748) [na:1.8.0_281]
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `org.club.entities.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('mohamed')
 at [Source: (byte[])"{"text":"azaz","avatar":"","Sendername":"ADMIN","recievername":"mohamed"}"; line: 1, column: 64] (through reference chain: org.club.entities.ChatMessage["recievername"])
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342) ~[jackson-databind-2.9.6.jar

标签: javajsonspring-bootwebsocket

解决方案


推荐阅读