为地方消息和发件人显示 "null"

Show "null" for a place message and sender

我在 vaadin 14 和 spring 引导程序上创建了聊天。

当我开始聊天时,我必须登录并按名称登录。所有进入聊天的人都可以在授权后写消息。

我有一个问题,当我发送消息时,聊天显示(null: null) 这是错误的,我需要显示发件人的名字和他的消息

我通过了调试器,在 json 中回答一切正常输出

但是当我在那里打开聊天 window 时,我看到的不是消息,而是发件人 "null:null")

主视图class

public class MainView extends VerticalLayout {
    private final MessagesInfoManager messagesInfoManager;
    private final RestService restService;
    private String username;
    private TextField textField;
    private Message messageLast;


    @Autowired
    public MainView(RestService restService) {
        this.messagesInfoManager = MessageConfigurator.getInstance().getChatMessagesInfoManager();
        addClassName("main-view");
        setSizeFull();
        setDefaultHorizontalComponentAlignment(Alignment.CENTER);

        H1 header = new H1("Vaadin Chat");
        header.getElement().getThemeList().add("dark");

        add(header);

        askUsername();
        this.restService = restService;
    }

    private void askUsername() {
        HorizontalLayout layout = new HorizontalLayout();
        TextField usernameField = new TextField();
        Button startButton = new Button("Start chat");

        layout.add(usernameField, startButton);

        startButton.addClickListener(click -> {
            username = usernameField.getValue();
            remove(layout);
            showChat(username);
        });

        add(layout);
    }

    private void showChat(String username) {
        MessageList messageList = new MessageList();

        List<Message> lasts = restService.getLast();
        for (Message message : lasts) {
            messageList.add(new Paragraph(message.getFromV() + ": " + message.getMessageV()));
        }

        messageLast = lasts.get(lasts.size() - 1);

        add(messageList, createInputLayout(username, messageList));
        expand(messageList);
    }

    private Component createInputLayout(String username, MessageList messageList) {
        HorizontalLayout layout = new HorizontalLayout();
        layout.setWidth("100%");

        TextField messageField = new TextField();
        messageField.addKeyDownListener(Key.ENTER, keyDownEvent -> sender(messageField, messageList));
        Button sendButton = new Button("Send");
        sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);

        layout.add(messageField, sendButton);
        layout.expand(messageField);

        messageField.addFocusListener(event -> {
            for (Message message : messagesInfoManager.getMessagesByUI(getUI())) {
                if (!message.getFromV().equals(username)) {
                    message.setUnread(false);
                    this.restService.updateMessage(message.getId(), message);
                }
            }
        });

        sendButton.addClickListener(click -> sender(messageField, messageList));
        messageField.focus();

        return layout;
    }

    private void sender(TextField textField, MessageList messageList) {
        Message message = new Message(username, textField.getValue());
        message = restService.saveMessage(message);
        messageLast = message;
        this.textField = textField;
     //   messagesInfoManager.updateMessageUIInfo(new MessageInfo(messageList, message, this));
        textField.clear();
        textField.focus();

    }

    @Scheduled(fixedDelay = 1000)
    public void scheduleFixedDelayTask() {

        MessageList messageList = new MessageList();

        List<LinkedHashMap> lasts = restService.getUnreadMessages(messageLast);

        for (LinkedHashMap message : lasts) {
            messageList.add(new Paragraph(message.get("fromV") + ": " + message.get("messageV")));
        }

        messagesInfoManager.updateMessageUIInfo(new MessageInfo(messageList, messageLast, this));

    }

}

class留言

public class Message {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;
  private Timestamp time;

  @Column(name = "fromV")
  private String fromv;
  @Column(name = "messageV")
  private String messagev;
  private boolean unread;

  public Timestamp getTime() {
    return time;
  }

  public void setTime(Timestamp time) {
    this.time = time;
  }

  public Message() {
    this(null, null);
  }

  public Message(String from, String message) {
    this.fromv = from;
    this.messagev = message;
    unread = true;
    time = new Timestamp(System.currentTimeMillis());
  }

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getFromV() {
    return fromv;
  }

  public void setFromV(String fromV) {
    this.fromv = fromV;
  }

  public String getMessageV() {
    return messagev;
  }

  public void setMessageV(String messageV) {
    this.messagev = messageV;
  }

  public boolean isUnread() {
    return unread;
  }

  public void setUnread(boolean unread) {
    this.unread = unread;
  }

  @Override
  public String toString() {
    return "Message{" +
            "id=" + id +
            ", time=" + time +
            ", fromv='" + fromv + '\'' +
            ", messagev='" + messagev + '\'' +
            ", unread=" + unread +
            '}';
  }
}

我的github

https://github.com/adk96/vaadin-chat

json 属性 名称与 Message class 的字段名称不匹配。方法 Gson.fromJson(...) 在 json 中看到字段 fromV, messageV,但是没有名为 fromVmessageV 的属性(因为它们被称为 fromvmessagev).

您有多种选择来解决此问题:

1) 将您的字段重命名为正确的驼峰式名称,以及它们的 getters/setters。

private String messageV;

public String getMessageV(){...}
publis void setMessageV(String messageV){...}

2) 更改创建的 json,因此 属性 名称中没有驼峰式。通过更改 Message:: toString 的输出或使用 proper/automatic 序列化(例如 Gson.toJson)。

3) 用 @JsonProperty 注释来注释您的属性,以告诉 gson 这个 属性 在 json 中有不同的名称。 getters/setters 必须匹配实际的 属性 名称。

@JsonProperty("messageV")
private String messagev;

public String getMessagev(...) 
public void setMessagev(String messagev){...}