java - 如何添加发送消息的时间(Spring Boot 和 MySQL)
问题描述
如何添加向数据库(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();
}
}
解决方案
让 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;
}
推荐阅读
- python - 检查输入时出错:预期 input_39 有 2 个维度,但得到了形状为 (100、50、780) 的数组
- html - 在 Power BI 中将 HTML 列转换为纯文本
- camunda - BPM 项目范围和边界
- linux - 需要在 shell 脚本中一次对两个 Oracle DB 执行一个 sql 查询,并将数据导出到单独的 csv 文件
- python - ctypes 等效于“字符名称 [MAX_DEVICE_NAME_LENGTH]”
- c++ - MyClassName 的初始化没有匹配的构造函数
- arrays - 在数组或熊猫数据框中附加元素
- java - 如何使用 JPQL 从 Spring Data Repository 获取 HashMap 结果?
- python - Python多次返回相同时间戳的问题
- spring-boot - Spring Boot - Liquibase - 偶尔执行需要很长时间(60x)