Проблема: @Autowired бобы в классе @ServerEndpoint нулевыеWebSockets JSR 356 Spring интеграция @ServerEndpoint
Как я могу убедиться, что этот WebSocketController класс ниже будет закачиваться с фасолью, то есть, как я могу это сделать управляемый Весной? Я могу подключиться к websocket таким образом, чтобы он работал, но gameService всегда имеет значение null внутри экземпляра класса WebSocketController, поэтому я думаю, что он создан tomcat каким-то образом, а не 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();
}
}
РЕДАКТИРОВАТЬ:
Использование Пружина 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