我使用带有STOMP和SockJS的Spring WebSockets作为前端。它工作很精细,但我有另一个困难。
这是后端代码:
@MessageMapping("/showAccountlist")
@SendTo("/topic/accounts")
public Account createPublishAccount(String name) throws Exception {
return new Account(name);
}
这是前端代码,它运行FINE,所有消息都发布到所有客户端。
stompClient.send("/app/showAccountlist", {}, name);
但是当我从我的java后端调用我的后端方法时,方法名称为
createPublishAccount("Carlos");
似乎消息未发布。有解决方案吗或者这不是它的工作方式,只有当它通过SockJS触发时才有效?
这是我的webconfig:
@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();
}
}
答案 0 :(得分:4)
通过调用@SendTo带注释的方法似乎无法发送消息。
Spring推荐的发送消息的方式是使用SimpMessagingTemplate
。可以将desination作为参数(在您的情况下为/topic/accounts
),例如在convertAndSendToUser
方法(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/messaging/simp/SimpMessagingTemplate.html)中。
请参阅Spring文档的摘录 (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-handle-send):
如果您想从应用程序的任何部分向连接的客户端发送消息,该怎么办?任何应用程序组件都可以向" brokerChannel"发送消息。最简单的方法是注入SimpMessagingTemplate,并使用它来发送消息。通常,应该很容易按类型注入,例如:
@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);
}
}