2015-12-12 30 views
1

問題:在@ServerEndpoint類@Autowired豆空的WebSockets JSR 356 Spring集成@ServerEndpoint

我怎樣才能確保此WebSocketController類下面將豆子被注入,這是我怎樣才能使它由Spring管理?我可以連接到websocket所以它的工作原理,但在WebSocketController類實例中gameService始終爲null,所以我認爲它是由tomcat以某種方式創建的,而不是Spring。

我正在使用Spring引導。我只需要弄清楚如何將bean注入到這個websocket控制器類中。

WebSocketController類

@Component 
@ServerEndpoint("/sock") 
public class WebSocketController { 

    @Autowired 
    private GameService gameService; 

    private static Set<Session> clients = Collections.synchronizedSet(new HashSet<Session>()); 

    @OnMessage 
    public void handleMessage(Session session, String message) throws IOException { 

     session.getBasicRemote().sendText(
       "Reversed: " + new StringBuilder(message).reverse()); 
    } 

    @OnOpen 
    public void onOpen(Session session) { 
     clients.add(session); 
     System.out.println("New client @"+session.getId()); 
     if (gameService == null) System.out.println("game service null"); 
    } 

    @OnClose 
    public void onClose(Session session) { 
     clients.remove(session); 
     System.out.println("Client disconnected @" + session.getId()); 
    } 
} 

GameService接口和實現

public interface GameService { 
    List<Character> getCharacters(); 
} 

@Service 
public class GameServiceMockImpl implements GameService { 

    @Override 
    public List<Character> getCharacters() { 
     List<Character> list = new ArrayList<>(); 
     list.add(new Character("aaa","1.png",100)); 
     list.add(new Character("aaa","2.jpg",100)); 
     list.add(new Character("aaa","3.jpg",100)); 
     return list; 
    } 
} 

應用類

@SpringBootApplication 
public class App { 

    public static void main(String args[]){ 
     SpringApplication.run(App.class,args); 
    } 

    @Bean 
    public ServerEndpointExporter serverEndpointExporter() { 
     return new ServerEndpointExporter(); 
    } 

} 

編輯:

使用Spring 4瓦ebSockets根本無法工作,我甚至無法通過瀏覽器進行連接。

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     registry.addHandler(myHandler(), "/myHandler"); 
    } 

    @Bean 
    public WebSocketHandler myHandler() { 
     return new MyHandler(); 
    } 

} 


public class MyHandler extends TextWebSocketHandler { 

    @Override 
    public void handleTextMessage(WebSocketSession session, TextMessage message) { 
     System.out.println(message.getPayload()); 
    } 

} 

回答

1

您正在嘗試集成Spring和Java WebSocket API。一個由@Component註解的類註冊到spring bean,並且它的實例由spring管理,但是如果一個類由@ServerEndpoint註解,它將註冊到服務器端WebSocket端點,並且每當相應端點的WebSocket連接到服務器時,它的實例由JWA實現創建和管理。我們不能同時使用兩個註釋。

要麼你可以使用CDI注入(您的服務器還應該支持)

@ServerEndpoint("/sock") 
public class WebSocketController { 

    @Inject 
    private GameService gameService; 

,或者對this文檔一看,春季4對WebSocket的

+0

謝謝回答。我寧願使用Spring 4 WebSocket,我也想使用沒有SockJS的「直接方法」。所以我創建了TextWebSocketHandler和WebSocketConfigurer。但它不起作用。我無法從瀏覽器連接。它在控制檯中表示它將給定的URL映射到文本處理程序,但仍然無法連接。我在主帖中添加了代碼。 – Greyshack

+1

我不得不允許來自其他來源的連接,它的工作原理。所以最後我使用Spring 4 websockets。 – Greyshack

+0

這很酷,但我不認爲它是最佳做法。 – Pulkit

2

支持也許這篇文章可以幫助:

https://spring.io/blog/2013/05/23/spring-framework-4-0-m1-websocket-support

您可以使用依賴關係(春季版本> 4)

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-websocket</artifactId> 
    <version>${spring.version}</version> 
</dependency> 

,然後簡單地

@ServerEndpoint(value = "/echo", configurator = SpringConfigurator.class) 
public class WebSocketEndpoint { 

    @Inject 
    private BroadcastService broadcaster; 
+0

美好而輕鬆。這是使它爲我工作的那個! – LordOfThePigs

+0

謝謝!爲我工作 –