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

Поток данных:

  1. Получение сообщения
  2. Преобразование в текст
  3. Сохранение в базу данных
  4. Отправка результата клиенту

Метод saveJsonToDatabase(String jsonString)

Основная логика обработки JSON и сохранения данных: 1. Парсинг JSON 2. Валидация необходимых полей (name, message) 3. Создание объекта UserData 4. Сохранение в базу данных 5. Формирование ответа

Обработка ошибок

  • Проверка формата JSON
  • Проверка наличия обязательных полей
  • Обработка ошибок при сохранении в базу данных

Возможные ответы

  1. Успешное сохранение: "Json Save: Success, ID: [id]"
  2. Отсутствие обязательных полей: "Json Save: Missing required fields (name, message)"
  3. Неверный формат JSON: "Json Save: Invalid JSON format: [error message]"
  4. Ошибка сохранения: "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)