Timertask для spring boot и проекта vaadin
сЯ создал чат на Vaadin и Spring Boot. Итак, у меня есть 4 api - 1) Save - который хранит сообщения в базе данных MySQL 2) Last - отображает последние 10 сообщений новому пользователю, вошедшему в чат
А также у меня есть 3)непрочитанные - которые должны были выводить непрочитанные сообщения из базы данных, но она хранит их в ArrayList(это неправильно) Они сказали мне удалить api 3)"непрочитанный" и 4)"обновление". На их месте создается новый "getLastUnreadMessage" - который должен запоминать ID последнего сообщения и отображать непрочитанные сообщения из базы данных MySQL
Может помочь создать "getLastUnreadMessage" - вывод непрочитанных сообщений из базы данных
Мой проект весь код и файлы https://github.com/fallen3019/vaadin-chat
Что я уже пробовал:
MainView <pre lang="java">@StyleSheet("frontend://styles/styles.css") @Route @PWA(name = "Vaadin MessagesInfoManager", shortName = "Vaadin MessagesInfoManager") @Push public class MainView extends VerticalLayout { private final MessagesInfoManager messagesInfoManager; private final RestService restService; private String username; @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.getFrom() + ": " + message.getMessage())); } 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.getFrom().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); messagesInfoManager.updateMessageUIInfo(new MessageInfo(messageList, message, this)); textField.clear(); textField.focus(); } }
MessageList
public class MessageList extends Div { public MessageList() { addClassName("message-list"); } @Override public void add(Component... components) { super.add(components); components[components.length-1] .getElement() .callFunction ("scrollIntoView"); } }
RestController
@org.springframework.web.bind.annotation.RestController public class RestController { @Resource private final MessageService messageService; public RestController(MessageService messageService) { this.messageService = messageService; } @PostMapping("/api/save") public Message saveMessage(@RequestBody Message chatMessage) { return messageService.add(chatMessage); } @GetMapping("/api/last") public String getLasts() { return new Gson().toJson(messageService.getLast()); } @GetMapping("/api/unread") public List<Message> getUnreadMessages() { return messageService.getUnreadMessages(); } @PutMapping("/api/update/{id}") public void updateMessage(@PathVariable long id, @RequestBody Message chatMessage) { messageService.updateMessage(id, chatMessage); } }
Класс сообщения
@Entity @Table(name = "chatMessages") public class Message { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private Timestamp time; private String fromV; 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 getFrom() { return fromV; } public void setFrom(String from) { this.fromV = from; } public String getMessage() { return messageV; } public void setMessage(String message) { this.messageV = message; } public boolean isUnread() { return unread; } public void setUnread(boolean unread) { this.unread = unread; } }
MessageInfo
public class MessageInfo { private MessageList messageList; private Message message; private VerticalLayout mainView; public MessageInfo(MessageList messageList, Message message, VerticalLayout mainView) { this.messageList = messageList; this.message = message; this.mainView = mainView; } public MessageList getMessageList() { return messageList; } public Message getMessage() { return message; } public Optional<UI> getUI() { return mainView.getUI(); } }
Рестсервис
@Service public class RestService { private final RestTemplate restTemplate; public RestService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder.build(); } public Message saveMessage(Message message) { String url = "http://localhost:8080/api/save"; return this.restTemplate.postForObject(url, message, Message.class); } public void updateMessage(long id, Message message) { String url = String.format("http://localhost:8080/api/update/%d", id); this.restTemplate.put(url, message); } 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()); } }