@当通过WebSocket从Javascript推送消息时,MessageMapping不会触发控制器
我正在尝试使用Spring4.1.1、Stomp2.3.3和SockJS0.3.4进行WebSocket演示 在服务器端: 有一个配置文件@当通过WebSocket从Javascript推送消息时,MessageMapping不会触发控制器,websocket,stomp,sockjs,spring-websocket,Websocket,Stomp,Sockjs,Spring Websocket,我正在尝试使用Spring4.1.1、Stomp2.3.3和SockJS0.3.4进行WebSocket演示 在服务器端: 有一个配置文件 @Configuration @EnableWebSocketMessageBroker public class AppWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessa
@Configuration
@EnableWebSocketMessageBroker
public class AppWebSocketConfig extends
AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic/");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello").withSockJS();
}
}
是处理消息的控制器
@Controller
public class EBConsoleWebSocketController {
private static final Logger LOG = Logger
.getLogger(EBConsoleWebSocketController.class);
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
LOG.info(message.getName());
return new Greeting("Hello, " + message.getName() + "!");
}
public class HelloMessage implements Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Greeting implements Serializable {
private String content;
public Greeting(String content) {
super();
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
}
问题在于@MessageMapping似乎不会触发问候语方法。
下面是客户端javascript
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("<c:url value='/hello'/>");
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(greeting) {
showGreeting(JSON.parse(greeting.body).content);
});
});
}
function disconnect() {
if (stompClient != null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
function sendName() {
var name = document.getElementById('name').value;
stompClient.send("/app/hello", {}, JSON.stringify({
'name' : name
}));
}
function showGreeting(message) {
var response = document.getElementById('response');
var p = document.createElement('p');
p.style.wordWrap = 'break-word';
p.appendChild(document.createTextNode(message));
response.appendChild(p);
}
var stompClient=null;
功能设置已连接(已连接){
document.getElementById('connect')。disabled=connected;
document.getElementById('disconnect')。disabled=!connected;
document.getElementById('conversationDiv')。style.visibility=connected?'visible':'hidden';
document.getElementById('response')。innerHTML='';
}
函数连接(){
var socket=new SockJS(“”);
stompClient=Stomp.over(套接字);
stompClient.connect({},函数(框架){
setConnected(true);
console.log('Connected:'+frame);
stompClient.subscribe('/topic/greetings',函数(greeting){
showGreeting(JSON.parse(greeting.body.content);
});
});
}
功能断开(){
if(stompClient!=null){
stompClient.disconnect();
}
设置连接(假);
控制台日志(“断开”);
}
函数sendName(){
var name=document.getElementById('name')。值;
stompClient.send(“/app/hello”,{},JSON.stringify({
“名称”:名称
}));
}
功能显示问候语(信息){
var response=document.getElementById('response');
var p=document.createElement('p');
p、 style.wordWrap='break word';
p、 appendChild(document.createTextNode(message));
反应。儿童(p);
}
无论如何都应该有一些网络交互。我建议在服务器上为org.springframework
打开DEBUG
,并使用嗅探工具查看网络流量。现代浏览器对此有一些插件。我看不到任何关键的东西,除非
,您可以将其更改为真正的ULR进行开发。是的,我同意。显示您的DispatcherServlet
配置。调试有进展吗?