2014-07-14 31 views
4

我正在構建一個應用程序,使用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方法,但都沒有工作。

有沒有人可以解釋我的問題?任何幫助,提示或建議將不勝感激!

在此先感謝。

+1

它們是相同的,唯一的區別是一個使用基於字段的注入其他基於構造函數的注入。這是唯一的區別。作爲一個經驗法則,你不應該在其他類中使用控制器,控制器是一個Web層組件,你不應該在其他類中使用它。如果您想重用該功能,請將其移至您在控制器和其他類中注入的服務類。您不是自己使用注入,而是自己創建對象實例,讓Spring爲您管理對象。 –

+0

啊,好的,這絕對清除了很多問題。我需要在服務類中放置哪些部分而不是控制器? – Theo

回答

1

正如註釋中所寫的那樣,自動裝配依賴有多種方式,它們大多是等價的,您必須根據需要選擇自己喜歡的依賴。

根據其他問題:在Spring中,控制器是監聽用戶請求的對象(單例),因此映射@RequestMapping處理對指定url的HTTP請求。

如果您需要使用SimpMessagingTemplate對象將消息從服​​務器推送到客戶端,您必須知道客戶端必須使用STOMP協議(通過websockets),並且它必須訂閱正確的主題。

事實上,使用STOMP服務器不能將任意消息推送到客戶端,但它只能將消息發佈到主題,並且客戶端必須訂閱正確的主題才能接收它們。

相關問題