問題:在@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());
}
}
謝謝回答。我寧願使用Spring 4 WebSocket,我也想使用沒有SockJS的「直接方法」。所以我創建了TextWebSocketHandler和WebSocketConfigurer。但它不起作用。我無法從瀏覽器連接。它在控制檯中表示它將給定的URL映射到文本處理程序,但仍然無法連接。我在主帖中添加了代碼。 – Greyshack
我不得不允許來自其他來源的連接,它的工作原理。所以最後我使用Spring 4 websockets。 – Greyshack
這很酷,但我不認爲它是最佳做法。 – Pulkit