package com.example.websocket8_4.handler;
import com.example.websocket8_4.model.UserData;
import com.example.websocket8_4.repository.UserDataRepository;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.reactive.socket.WebSocketHandler;
import org.springframework.web.reactive.socket.WebSocketSession;
import reactor.core.publisher.Mono;
@Controller
public class JsonSaveHandler implements WebSocketHandler {
@Autowired
private UserDataRepository userDataRepository;
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public Mono<Void> handle(WebSocketSession session) {
return session.receive()
.map(msg -> msg.getPayloadAsText()) // Получаем текст из WebSocket сообщения
.flatMap(this::saveJsonToDatabase) // Сохраняем в БД
.flatMap(result -> session.send(Mono.just(session.textMessage(result)))) // Отправляем результат обратно
.then();
}
// Метод для сохранения данных из JSON
private Mono<String> saveJsonToDatabase(String jsonString) {
try {
JsonNode jsonNode = objectMapper.readTree(jsonString); // Парсинг JSON строки
// Проверка наличия полей "name" и "message"
if (jsonNode.hasNonNull("name") && jsonNode.hasNonNull("message")) {
String name = jsonNode.get("name").asText();
String message = jsonNode.get("message").asText();
// Создание объекта UserData и его сохранение
UserData userData = new UserData();
userData.setName(name);
userData.setMessage(message);
return userDataRepository.save(userData)
.map(saved -> "Json Save: Success, ID: " + saved.getId()) // Возврат ID сохранённого объекта
.onErrorResume(e -> Mono.just("Json Save: Error: " + e.getMessage())); // Обработка ошибки при сохранении
} else {
return Mono.just("Json Save: Missing required fields (name, message)");
}
} catch (Exception e) {
return Mono.just("Json Save: Invalid JSON format: " + e.getMessage());
}
}
}
обработчик JsonSaveHandler. Давайте проанализируем его:
Анализ JsonSaveHandler
Обзор
JsonSaveHandler
- это реактивный WebSocket обработчик, который принимает JSON-сообщения, сохраняет их в базу данных и отправляет результат обработки обратно клиенту.
Ключевые компоненты
Зависимости
UserDataRepository
- репозиторий для работы с базой данныхObjectMapper
- утилита для работы с JSON
Основной метод handle(WebSocketSession session)
public Mono<Void> handle(WebSocketSession session) {
return session.receive()
.map(msg -> msg.getPayloadAsText())
.flatMap(this::saveJsonToDatabase)
.flatMap(result -> session.send(Mono.just(session.textMessage(result))))
.then();
}
Поток данных:
- Получение сообщения
- Преобразование в текст
- Сохранение в базу данных
- Отправка результата клиенту
Метод saveJsonToDatabase(String jsonString)
Основная логика обработки JSON и сохранения данных: 1. Парсинг JSON 2. Валидация необходимых полей (name, message) 3. Создание объекта UserData 4. Сохранение в базу данных 5. Формирование ответа
Обработка ошибок
- Проверка формата JSON
- Проверка наличия обязательных полей
- Обработка ошибок при сохранении в базу данных
Возможные ответы
- Успешное сохранение: "Json Save: Success, ID: [id]"
- Отсутствие обязательных полей: "Json Save: Missing required fields (name, message)"
- Неверный формат JSON: "Json Save: Invalid JSON format: [error message]"
- Ошибка сохранения: "Json Save: Error: [error message]"
Взаимодействие с базой данных
Использует реактивный подход:
- userDataRepository.save()
возвращает Mono<UserData>
- Обработка ошибок через onErrorResume
Дополнительные замечания: 1. Это реактивный обработчик, использующий Project Reactor 2. Ожидает JSON определенного формата с полями "name" и "message" 3. Использует репозиторий для сохранения данных, вероятно, в реактивную базу данных
Для полного понимания работы приложения было бы полезно увидеть: 1. Класс UserData 2. Реализацию UserDataRepository 3. Остальные обработчики (ChatHandler, UpperCaseHandler, LowerCaseHandler)