3

問題: @ServerEndpoint クラスの @Autowired Bean が null です

以下のこの WebSocketController クラスに Bean が注入されるようにするにはどうすればよいですか。つまり、Spring で管理するにはどうすればよいですか? websocket に接続できるので動作しますが、gameService は WebSocketController クラス インスタンス内で常に null であるため、Spring ではなく Tomcat によって作成されていると思います。

私はSpring Bootを使用しています。この WebSocket コントローラー クラスに Bean を注入する方法を理解する必要があるだけです。

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 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());
    }

}
4

2 に答える 2

3

Spring と Java WebSocket API を統合しようとしています。によってアノテーションが付け@ComponentられたクラスはSpring Beanに登録され、そのインスタンスはSpringによって管理されますが、クラスがアノテーションを付けられた場合@ServerEndpoint、サーバー側のWebSocketエンドポイントに登録され、対応するエンドポイントのWebSocketがサーバーに接続されるたびに、そのインスタンスがJWA 実装によって作成および管理されます。両方の注釈を一緒に使用することはできません。

CDIインジェクションを使用できます(サーバーもサポートする必要があります)

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

    @Inject
    private GameService gameService;

または、このドキュメントをご覧ください。Spring 4 は WebSocket をサポートしています。

于 2015-12-13T05:09:51.017 に答える