Jephery
8/25/2016 - 1:46 PM

Guice dependency injection for Jetty (v9.3.11) WebSockets

Guice dependency injection for Jetty (v9.3.11) WebSockets

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.websocket.server.WebSocketHandler;


public class WebsocketEchoServer {

    private Server server;

    public WebsocketEchoServer(int port) {
        server = new Server(port);
        server.setHandler(
                new GuiceWebSocketHandler(EchoServerSocket.class, new EchoServerModule())
        );
    }

    public void run() throws Exception {
        server.start();
        server.join();
    }

}
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

import org.eclipse.jetty.websocket.server.WebSocketHandler;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;

import static com.google.common.base.Preconditions.checkNotNull;


public class GuiceWebSocketHandler extends WebSocketHandler implements WebSocketCreator {

    private final Class<?> socketClass;
    private final Injector injector;

    public GuiceWebSocketHandler(Class<?> socketClass, Module... modules) {
        this.socketClass = checkNotNull(socketClass);

        this.injector = Guice.createInjector(modules);
    }

    @Override
    public void configure(WebSocketServletFactory factory) {
        factory.setCreator(this);
    }

    @Override
    public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) {
        return injector.getInstance(socketClass);
    }

}