【问题标题】:How can I add the time of sending a message (Spring Boot and MySQL)如何添加发送消息的时间(Spring Boot 和 MySQL)
【发布时间】:2020-03-29 22:41:33
【问题描述】:

如何添加向数据库(MySQL)和程序发送消息的时间。我通过 Vaadin 14 UI 框架创建了一个界面。我通过浏览器启动它,我有一个聊天,几个人可以在那里交流。他们的消息存储在数据库中。现在您需要添加用户发送消息的时间。我确保数据库保存了用户和他的消息,但我无法添加发送消息的时间

休息控制器

@SpringComponent
@org.springframework.web.bind.annotation.RestController
public class RestController {
    private List<Message> store;

    public RestController() {
        store = new ArrayList<>();
    }

    @PutMapping("/api/save")
    public void saveMessage(@RequestBody String chatMessage) {
        store.add(new Gson().fromJson(chatMessage, Message.class));

        if (store.size() > 10)
            store.remove(0);
    }

    @GetMapping("/api/last")
    public String getLasts() {
        return new Gson().toJson(store);
    }
}

消息类

@Entity
@Table(name = "chatMessages")
public class Message {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  private String fromV;
  private String messageV;

  public Message() { }

  public Message(String from, String message) {
    this.fromV = from;
    this.messageV = message;
  }

  public long getId() {
    return id;
  }

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

  public String getFrom() {
    return fromV;
  }

  public void setFrom(String from) {
    this.fromV = from;
  }

  public String getMessage() {
    return messageV;
  }

  public void setMessage(String message) {
    this.messageV = message;
  }
}

休息服务

@SpringComponent
@Service
public class RestService {
    private final RestTemplate restTemplate;
    private final MessageService messageService;

    public RestService(RestTemplateBuilder restTemplateBuilder,
                       MessageService messageService) {
        this.restTemplate = restTemplateBuilder.build();
        this.messageService = messageService;
    }

    public void saveMessage(Message message)
    {
        String url = "http://localhost:8080/api/save";

        this.restTemplate.put(url, new Gson().toJson(message));
        this.messageService.add(new Message(message.getFrom(), message.getMessage()));
    }

    public List<Message> getLast() {
        String url = "http://localhost:8080/api/last";

        String json = restTemplate.getForObject(url, String.class);
        return new Gson().fromJson(json, new TypeToken<List<Message>>(){}.getType());
    }
}

主视图

@StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin Chat", shortName = "Vaadin Chat")
@Push
public class MainView extends VerticalLayout {
  private final UnicastProcessor<Message> publisher;
  private final Flux<Message> messages;
  private String username;

  @Autowired
  private RestService restService;

  public MainView(UnicastProcessor<Message> publisher,
                  Flux<Message> messages) {
    this.publisher = publisher;
    this.messages = messages;

    addClassName("main-view");
    setSizeFull();
    setDefaultHorizontalComponentAlignment(Alignment.CENTER);

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

    add(header); 

    askUsername();
  }


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

    add(layout);
  }

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

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

    List<Message> lasts = restService.getLast();
    for (Message message : lasts)
      messageList.add(new Paragraph(message.getFrom() + ": " + message.getMessage()));

    messages.subscribe(message -> {
      getUI().ifPresent(ui ->
          ui.access(() ->
              messageList.add(
                  new Paragraph(message.getFrom() + ": " +
                      message.getMessage())
              )
          ));
    });
  }

  private Component createInputLayout() {
    HorizontalLayout layout = new HorizontalLayout();
    layout.setWidth("100%");

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

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

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

    return layout;
  }
 private void sender(TextField textField) {
    Message message = new Message(username, textField.getValue());
    publisher.onNext(message);
    restService.saveMessage(message);
    textField.clear();
    textField.focus();
  }
}

【问题讨论】:

  • 你在哪里节省用户发送消息的时间?
  • 我认为您应该有一个位于message 类中的字段来接收时间。您可以获取服务器的时间并将其添加到 message 类中的 time 字段中。

标签: java spring spring-boot chat vaadin


【解决方案1】:

让 Spring 为您管理时间戳和用户名,因为您已经使用 Spring Boot。

https://docs.spring.io/spring-data/jpa/docs/2.2.x/reference/html/#auditing

class Message {

  @CreatedBy
  private User user;

  @CreatedDate
  private DateTime createdDate;
}

【讨论】:

    【解决方案2】:

    你的message 类应该是这样的:

     @Entity
     @Table(name = "chatMessages")
     @Data
     public class Message {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private long id;
    
          private String fromV;
          private String messageV;
          private Timestamp sendTime;
    

    在您的RestService 班级中:

    public void saveMessage(Message message)
        {
            String url = "http://localhost:8080/api/save";
            message.setsendTime(new Timestamp(new Date().getTime()));
            this.restTemplate.put(url, new Gson().toJson(message));
            this.messageService.add(new Message(message.getFrom(), message.getMessage()));
        }
    

    我希望这会有所帮助:)。

    【讨论】:

    • 我正在寻找打开聊天的方法
    • 如果你不介意,我只使用 Facebook 作为国际社交媒体。
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多