当前位置: 首页 > 知识库问答 >
问题:

为什么Spring SendToUser不工作

晁文斌
2023-03-14

我只是按照spring的指示将响应发送回特定用户,而不是广播消息。但最终,无法发送回响应消息。

这是我的js代码:

var stompClient = null;
function setConnected(connected) {
    document.getElementById('connect').disabled = connected;
    document.getElementById('disconnect').disabled = !connected;
    document.getElementById('conversationDiv').style.visibility = 
            connected ? 'visible': 'hidden';
    document.getElementById('response').innerHTML = '';
}
function connect() {
    var socket = new SockJS('reqsample');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('user/queue/resp', function(resp) {
            var body = JSON.parse(resp.body);
            showResp('cmid:' + body.cmid + ',reqName:' + body.reqName
                    + ',custNo:' + body.custNo + ',qty:' + body.quantity);
        });
        stompClient.subscribe('user/queue/errors', function(resp) {
            var body = JSON.parse(resp.body);
            showResp(body);
        });
    });
}
function disconnect() {
    stompClient.disconnect();
    setConnected(false);
    console.log("Disconnected");
}
function sendName() {
    var name = document.getElementById('name').value;
    stompClient.send("/app/req", {}, JSON.stringify({
        'name' : name
    }));
}

这是控制器:

@Controller
public class MessageController {
    @MessageMapping("/req")
    @SendToUser("/queue/resp")
    public RespMessage greeting(ReqMessage message, Principal pc)
        throws Exception {
    System.out.println("---- received message: " + message == null ? "NULL"
            : message.getName());
    System.out.println("---- received user info: " + pc.getName());
    RespMessage rm = new RespMessage();
    rm.setCmid("CM_01");
    rm.setCustNo("Cust_02");
    rm.setQuantity("1000");
    rm.setReqName(message.getName());
    return rm;

    }

    @MessageExceptionHandler
    @SendToUser("/queues/errors")
    public String handleException(Exception ex) {
        System.out.println(ex);
        return ex.getMessage();
    }

    }

这是Spring配置:

<context:component-scan base-package="wx.poc7" />
<mvc:annotation-driven />
<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>
<mvc:resources mapping="/js/**" location="/js/" />
<websocket:message-broker
    application-destination-prefix="/app" user-destination-prefix="/user">
    <websocket:stomp-endpoint path="reqsample">
        <websocket:sockjs />
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/queue, /topic" />
 </websocket:message-broker>

请帮忙。谢谢提前。

我已经尝试使用@SendToUser,@SendToUser(/队列/resp)和SimpMessagingTem板以及,完全不能响应消息到浏览器。

共有3个答案

钮勇
2023-03-14

在Javascript中订阅频道时:

stompClient.subscribe('user/queue/errors', function(resp) {
            var body = JSON.parse(resp.body);
            showResp(body);
        });

正确的路径是“用户/”用户名“队列/错误”

也看看这个主题:在SpringWebSocket上向特定用户发送消息

何建中
2023-03-14

您的WebSocket配置看起来不错,但我认为问题在于正确的连接URL:

new SockJS('reqsample')

请确保此URL有效。我看到您对stomp endpoint path=“reqsample”使用了相同的方法。但是不要忘记,在web中有一个DispatcherServlet映射。xml

尝试使用SockJS构造函数(包括主机和端口)中的fullurl。这样地:

http://localhost:8080/reqsample

如果您的DispatcherServlet映射到/

当您为STOMPendpoint找到正确的URL时,您可以使用该JSP中的相对路径。

东方修谨
2023-03-14

用户目的地前缀为/user,但订阅目的地中似乎缺少/。更改user/队列/resp/user/队列/resp以接收客户端上的消息。

 类似资料:
  • 当我调用下面的代码时,我总是得到 用户的值。Id和密码有效。结果错误总是说“无效令牌”,我没有尽可能地看到它,因为我得到它并立即检查它和它的错误。这只是一个理智测试——我通常通过电子邮件向用户发送令牌,但这也不起作用。 UPDATE 1我在同一个控制器中定义UserManager,如下所示: UPDATE 2这是我的Application ationUserManager代码:

  • 使用scandir()函数时,我收到以下php警告: Scandir无法打开目录:公共html/page2中不允许操作。php在线3 第2页。php 我想使用这个功能来打印我的根文件夹的文件和子目录,但它不工作。 有人知道怎么修吗?

  • 有人能找出为什么我的不能工作。也许我错过了什么。我意识到这可能是愚蠢的没有任何更多的上下文比我所展示的,但请您询问,我将很乐意提供更多。 这是一段很大的代码,所以我不知道如何用它生成SSCE。您正在查看的是子类的构造函数,它包含3个面板。此时,只是一个。方法打开一个filechooser,然后加载选定的图像,该图像被绘制到上。图像显示良好,一切正常,除了我调整窗口大小时,没有滚动条。

  • 问题内容: 我想使用Vim来查看结果(不在shell中)。我认为可以使用(将的结果用作的输入),但返回结果为: 有人可以解释吗? 问题答案: 通过传递到 vim中 ,您正在更改标准输入流。由于 vim 是交互式程序,因此它需要标准输入作为控制台。 如果要在vim中查看,应该告诉它您正在从stdin中读取文件(通过提供参数): 另外,您可以使用 更多 或 更少 : 后两者是优选的。如果通过管道 传送

  • 我有模型类别。它可能有父类别和子类别列表。我写这个问题是因为找不到实体和自己相关的情况。 我试图这样实现它: 我保存实体,如: 我希望看到这样的情况: 但是在子模型中,我有递归循环。如何防止它? 是的,我也使用了@JsonIgnore。但是我不确定这是不是一个好的做法。但是如果我有一个案例,当我需要一个类别时,我真的需要将它发送给父母的UI。@JsonIgnore可以产生这个吗?