WebSockets JSR 356 Spring 集成 @ServerEndpoint

2024-01-05

问题:@ServerEndpoint 类中的 @Autowired beans 为 null

我怎样才能确保下面这个WebSocketController类将被注入bean,也就是说我怎样才能让它由Spring管理?我可以连接到 websocket,因此它可以工作,但是 gameService 在 WebSocketController 类实例中始终为 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();
    }

}

EDIT:

使用 Spring 4 WebSockets 根本不起作用,我什至无法通过浏览器连接。

@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 和 Java WebSocket API。注释为的类@Component注册到一个 spring bean 并且它的实例由 spring 管理,但是如果一个类被注释@ServerEndpoint它注册到服务器端 WebSocket 端点,每次相应端点的 WebSocket 连接到服务器时,它的实例都会由 JWA 实现创建和管理。我们不能同时使用这两个注释。

你可以使用CDI注入(你的服务器也应该支持)

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

    @Inject
    private GameService gameService;

或者看看this http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.htmldoc,Spring 4 支持 WebSocket

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSockets JSR 356 Spring 集成 @ServerEndpoint 的相关文章

随机推荐