Отправка сообщений с сервера клиенту и вывод их в поле

Есть небольшое приложение на spring boot, которое в сервисе вызывает метод setMessage во многих местах, для вывода пользователю уведомлений, ошибок в результате проверки и т.д. и html форма с textarea куда выводятся эти уведомления..

Для вывода уведомлений используется Server Sent Events, но проблема в том, что выводимые уведомления некорректно выводятся. Вместо кириллицы знаки ???. Как задать кодировку, чтобы выводилось в кириллице?

Форма html выглядит так:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:encoding="UTF-8">
<head>
    <meta charset="UTF-8">
</head>
<body>

<div class="container">

        <div class="form_wrapper">
            <form th:method="post" action="/" th:object="${dates}">

                <button type="button" onclick="postData()">Запустить</button>

                <div class="log_wrapper">
                    <textarea class="logs" name="logs" id="logs"></textarea>
                </div>

            </form>
        </div>

</div>
<script>
    var source = new EventSource("/subscribe");
    source.addEventListener("message", function(event) {
        var log = document.getElementById("logs");
        log.value += event.data + "\n";
    });
</script>

<script>
    function postData() {
        var formData = new FormData(document.querySelector("form"));

        fetch("/", {
            method: "POST",
            body: formData,
        })
            .then((response) => {
                if (response.ok) {
                    return response.text();
                } else {
                    throw new Error("Ошибка запроса.");
                }
            })
            .then((result) => {
                alert(result);
            })
            .catch((error) => {
                alert(error);
            });
    }
</script>

</body>
</html>

Контроллер:

@Controller public class MainController {

private final CreateFile createFile;

@Autowired
public MainController(CreateFile createFile) {
    this.CreateFile = createFile;
}

@GetMapping("/")
public String main() {
    return "index";
}

@PostMapping("/")
public ResponseEntity<String> post() {
    createFile.method1();
    createFile.method2();
    return ResponseEntity.ok("Выполнение успешно завершено!");
}

@GetMapping("/subscribe")
public SseEmitter subscribe() {
    return createFile.subscribe();
}

}

И сам класс CreateFile

@Service
public class CreateFile {
    private final List<SseEmitter> emitters = new CopyOnWriteArrayList<>();
    private String message = "";
    @Autowired
    public CreateFile() {
        
    }

    public void setMessage(String message) {
        for (SseEmitter emitter : emitters) {
            try {
                emitter.send(SseEmitter.event().data(message));
            } catch (IOException e) {
                emitters.remove(emitter);
            }
        }
    }

    public SseEmitter subscribe() {
        SseEmitter emitter = new SseEmitter();
        emitters.add(emitter);
        emitter.onCompletion(() -> emitters.remove(emitter));
        return emitter;
    }

    public String getMessage() {
        return message;
    }

    public void method1() {
        if(...) {
            setMessage("Сообщение 1");
        }
        
        if(...) {
            setMessage("Сообщение 2");
        }
        
        ***
        
        if(...) {
            setMessage("Сообщение n");
        }
    }

    public void method1() {
        if(...) {
            setMessage("Сообщение 1");
        }
        
        if(...) {
            setMessage("Сообщение 2");
        }
        
        ***
        
        if(...) {
            setMessage("Сообщение n");
        }
    }
}

Ответы (0 шт):