Ответы пользователя по тегу Spring
  • Как оганизовать функционал, при добавлении комментария под книгой сообщение о добавлении комментария должно всплывать всем подключённым пользователям?

    Erik_Mironov
    @Erik_Mironov
    Старые вопросы: *Dies from cringe*
    Необходимо добавить метод для отправки сообщения всем подключенным клиентам при добавлении нового комментария.

    public void sendCommentToAllClients(Comment comment) {
        if (ns != null) {
            ns.broadcast("comment:save", comment);
        }
    }


    После сохранения комментария, необходимо отправить его через SocketEmitter всем клиентам.

    @PostMapping("/add-comment")
    public ResponseEntity<Comment> addComment(@RequestBody BookResponse reqBody, Authentication authentication) {
        try {
            // (...)
            commentRepository.save(comment);
    
            // Отправляем комментарий всем подключенным клиентам
            socketEmitter.sendCommentToAllClients(comment);
    
            return ResponseEntity.status(HttpStatus.OK).body(comment);
        } catch (Exception ex) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .build();
        }
    }


    Вы уже реализовали прослушивание события comment:save на клиенте, поэтому необходимо только убедиться, что данные обрабатываются корректно.

    useEffect(() => {
        socket.on('comment:save', (data: Comment) => {
            const comment = JSON.parse(data as any)
            console.log('comment', comment);
            props.book.comments.push(comment);
            // Если setBookInState обновляет состояние, это может быть полезно для перерисовки
            // props.setBookInState({...props.book}); 
            toast.info('Got event from socket: Book ' + comment.text)
        });
    }, [socket]);
    Ответ написан
  • Почему @ModelAttribute возвращает значение только одной колонки?

    Erik_Mironov
    @Erik_Mironov
    Старые вопросы: *Dies from cringe*
    Когда вы используете атрибут disabled для<input>, значение этого поля не отправляется на сервер вместе с другими данными формы. Таким образом, при отправке формы, поля с атрибутом disabled будут игнорироваться.

    В вашем коде, поле *{settings[__${item.index}__].name} установлено как disabled, и поэтому name всегда будет null при обработке POST-запроса на сервере.

    Чтобы решить эту проблему, вы можете использовать дополнительное скрытое поле для передачи значений, которые не предназначены для редактирования пользователем, например

    <td>
        <input disabled th:value="*{settings[__${item.index}__].name}">
        <input type="hidden" th:field="*{settings[__${item.index}__].name}">
    </td>
    Ответ написан
  • URL на личный кабинет пользователя?

    Erik_Mironov
    @Erik_Mironov
    Старые вопросы: *Dies from cringe*
    Spring Security предоставляет класс SecurityContextHolder, который позволяет выполнять поиск текущего аутентифицированного пользователя через:
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    Authentication предоставляет следующие методы:

    - Получить имя пользователя вошедшего в систему: getPrincipal()
    - Получить пароль аутентифицированного пользователя: getCredentials()
    - Получить назначенные роли аутентифицированного пользователя: getAuthorities()
    - Получить дополнительную информацию об аутентифицированном пользователе: getDetails()

    Вы можете добавить к Model текущему авторизованному пользователю в вашем контроллере:

    public String foo(Model model) {
        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = user.getUsername();
        model.addAttribute("username", username);
        return "your_view";
    }

    а затем в вашем html:
    <td th:each="user : ${user}">
        <a th:if="${username == user.username}" th:href="@{/profile/{id}(id=${user.id}}">Profile</a>
    </td>
    Ответ написан
    Комментировать