我正在構建一個應用程序,使用Stomp通過websockets對代理消息進行代理。我試圖從服務器發送消息到客戶端,而沒有來自應用程序中任何地方的請求。我在網上發現了兩個單獨的選擇,用於從應用程序的任何位置發送消息Spring STOMP從應用程序中的任何位置發送消息
第一在Websocket documentation.部分20.4.5中找到:
@Controller
public class GreetingController {
private SimpMessagingTemplate template;
@Autowired
public GreetingController(SimpMessagingTemplate template) {
this.template = template;
}
@RequestMapping(value="/greetings", method=POST)
public void greet(String greeting) {
String text = "[" + getTimestamp() + "]:" + greeting;
this.template.convertAndSend("/topic/greetings", text);
}
}
二是a guide written by one of the Spring Bloggers:
@Controller
public class GreetingController {
@Autowired
private SimpMessagingTemplate template;
@RequestMapping(value="/greeting", method=POST)
public void greet(String greeting) {
String text = "[" + getTimeStamp() + "]:" + greeting;
this.template.convertAndSend("/topic/greeting", text);
}
}
兩者都非常相似。第一個覆蓋默認的構造函數,不會自動啓動模板初始化。第二個不創建一個新的構造函數,但自動裝入模板初始化。我的第一個問題是這兩個行爲是否相同?
更緊迫的問題是我無法從任何地方調用「迎接」方法。我嘗試了幾種不同的方法。
以下是第一條:
public class modifier {
@Autowired
private HelloController sender;
public void adder(String words) throws Exception {
sender.greet(words);
}
}
在上述情況下,它好像新的HelloController中從未初始化。調試時,我發現當加法器方法調用「greet」方法時,發件人爲空,並且收到空指針異常。
這裏是我已用於建立另一條路線:
public class modifier {
public void adder(String words) throws Exception {
HelloController sender = new HelloController();
sender.greet(words);
}
}
在該第二上面的情況下,調試完畢後,也有一個零指示字例外,但是它不與發件人。它是與sender.template。發件人的模板被初始化,但它永遠不會被賦予一個值或id。然後,當在greet中調用this.template.convertAndSend()時,會在this.template上引發空指針異常。
我已經混合並匹配了控制器的兩個gound實現和我的兩個實現從應用程序中的一個單獨的類調用greet方法,但都沒有工作。
有沒有人可以解釋我的問題?任何幫助,提示或建議將不勝感激!
在此先感謝。
它們是相同的,唯一的區別是一個使用基於字段的注入其他基於構造函數的注入。這是唯一的區別。作爲一個經驗法則,你不應該在其他類中使用控制器,控制器是一個Web層組件,你不應該在其他類中使用它。如果您想重用該功能,請將其移至您在控制器和其他類中注入的服務類。您不是自己使用注入,而是自己創建對象實例,讓Spring爲您管理對象。 –
啊,好的,這絕對清除了很多問題。我需要在服務類中放置哪些部分而不是控制器? – Theo