Java Spring WebSocket:消息未发布

Java Spring WebSocket:消息未发布,java,spring,websocket,stomp,spring-websocket,Java,Spring,Websocket,Stomp,Spring Websocket,我使用带有STOMP和SockJS的Spring WebSocket作为前端。它工作得很好,但我还有一个困难 这是后端代码: @MessageMapping("/showAccountlist") @SendTo("/topic/accounts") public Account createPublishAccount(String name) throws Exception { return new Account(name); } 这是前端代码,工作正常,所有消息都

我使用带有STOMP和SockJS的Spring WebSocket作为前端。它工作得很好,但我还有一个困难

这是后端代码:

 @MessageMapping("/showAccountlist")
 @SendTo("/topic/accounts")
 public Account createPublishAccount(String name) throws Exception {

     return new Account(name);
 }
这是前端代码,工作正常,所有消息都会发布到所有客户端

 stompClient.send("/app/showAccountlist", {}, name);
但是当我用方法名从我的java后端调用我的后端方法时

createPublishAccount("Carlos");
消息似乎无法发布。有解决办法吗?或者这不是它的工作方式,它只在通过SockJS触发时工作

这是我的网络配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer  {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/showAccountlist").withSockJS();
}

}

似乎不可能通过调用@SendTo注释方法来发送消息

Spring推荐的发送消息的方式是使用
SimpMessageTemplate
。例如在
convertAndSendToUser
方法()中,可以将desinion作为参数(在您的案例中为
/topic/accounts

请参阅Spring文档的摘录 ():

如果要从应用程序的任何部分向连接的客户端发送消息,该怎么办?任何应用程序组件都可以向“brokerChannel”发送消息。最简单的方法是注入SimpMessageTemplate,并使用它发送消息。通常,按类型注入应该很容易,例如:


带有createPublishAccount方法的类是由Spring实例化的吗?似乎不可能通过调用@SendTo注释的方法来发送消息。使用
SimpMessagingTemplate
是否可以工作?当然可以。请参阅@Jakub Bibro感谢SimpMessageTemplate works。如果您可以用描述性的方式和代码示例更新您的答案。我会接受的,汉克斯,赏金也会在20小时内接受。不过我有个问题。方法“convertAndSend”也接受参数“user”,向特定用户发送消息。但是我不知道怎么用这个。这里的用户是什么?如果某个帐户收到钱,我需要更新客户端的余额信息。这适用于spring security的主体名称。有关更多详细信息,请参阅。因此,基于队列名称和主体名称,spring将其转换为特定的队列名称,消息将传递给特定的用户。我的应用程序不使用身份验证,在这种情况下我还可以使用spring安全性吗?也许每次建立websocket连接时,我都需要在客户端悄悄地生成一个随机用户名?是的,您可以将spring安全性添加到您的项目中,因为您需要确保用户只接收自己的消息。见和。“Spring的STOMP WebSocket支持希望用户已经通过HTTP进行了身份验证”。但在afair中,可以通过websocket会话来区分用户。这在很大程度上取决于您试图解决的问题。谢谢,我通过简单地/topic/balance/${pageContext.session.id}并将会话id附加到所有帐户来解决问题
@Controller
public class GreetingController {

    private SimpMessagingTemplate template;

    @Autowired
    public GreetingController(SimpMessagingTemplate template) {
        this.template = template;
    }

    @RequestMapping(path="/greetings", method=POST)
    public void greet(String greeting) {
        String text = "[" + getTimestamp() + "]:" + greeting;
        this.template.convertAndSend("/topic/greetings", text);
    }

}