Показать "null" для места сообщения и отправителя - PullRequest
2 голосов
/ 28 января 2020

Я создал чат на vaadin 14 и весенней загрузке.

Когда я запускаю чат, я должен войти в систему и войти по имени. Каждый, кто вошел в чат, может писать сообщения после авторизации.

У меня проблема, когда я отправляю сообщение, в чате (ноль: ноль) это неправильно, мне нужно показать имя отправителя и его сообщение

я прошел через отладчик, в json отвечаю все выводит нормально enter image description here

Но когда я там открываю окно чата, вместо сообщений и отправитель показывает мне «null: null»)

enter image description here

Класс MainView

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

    }

}

Класс Сообщение

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

1 Ответ

2 голосов
/ 28 января 2020

Имена свойств json не соответствуют именам полей класса Message. Метод Gson.fromJson(...) видит в json поля fromV, messageV, но нет свойств с именами fromV и messageV (потому что они называются fromv и messagev).

У вас есть несколько способов как это исправить:

1) переименуйте ваши поля в правильные имена camelCase, а также их получатели / установщики.

private String messageV;

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

или

2 ) измените созданный json, чтобы он не содержал camelCase в именах свойств. Либо изменив вывод Message:: toString, либо используя правильную сериализацию / automati c (например, Gson.toJson).

или

3) аннотируйте свои свойства с помощью @JsonProperty аннотация, сообщающая gson, что это свойство имеет другое имя в json. Однако получатели / установщики должны соответствовать фактическому имени свойства.

@JsonProperty("messageV")
private String messagev;

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