Javalin i websocket

1

Mój kod wygląda tak:

package io.test;

import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;

@WebSocket(maxTextMessageSize = 64 * 1024)
public class ChatWebsocket {
    @OnWebSocketMessage
    public void onText(Session session, String message) {
        if (session.isOpen()) {
            System.out.printf("Echoing back message [%s]%n", message);
            // echo the message back
            session.getRemote().sendString(message, null);
        }
    }
}

package io.test;

import io.javalin.Javalin;

public class Application {
    public static void main(String[] args) {
        Javalin app = Javalin.create().start(7000);
        app.ws("/websocket/:id", ChatWebsocket.class);
        app.get("/", ctx -> ctx.result("Hello World"));
    }
}

Niestety kompilator "krzyczy" taki komunikat:

error: incompatible types: Class<ChatWebsocket> cannot be converted to Consumer<WsHandler>
app.ws("/websocket/:id", ChatWebsocket.class);

Według dokumentacji do metody "ws" można przekazywać tylko lambdy
Link do dokumentacji:
https://javalin.io/documentation#websockets

Jednak w starszych wersjach Javalin można było przekazać cały object
Link:
https://javalin.io/news/2017/09/22/javalin-0.5.1-released.html

Czy jest możliwość żeby można było przekazać objekt wraz z zależnościami, z której websocket ma skorzystać?

app.ws("/websocket", new WebSocketObject(param1, param2));
1

W wersji 2.0, implementacja WebSocket'ow zostala calkowicie przepisana. Na ten moment, nie wspiera juz ona obiektow WebSocket.
Odwolujesz sie do funkcjonalnosci z wersji 1.X, 2.X wersja nie jest wstecznie kompatybilna.

Mozesz zrobic tak, aby twoj obiekt implementowal interfejs Consumer<WsHandler> i sygnatura bedzie pasowac.

import io.javalin.websocket.WsHandler;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;

import java.util.function.Consumer;

public class ChatWebsocket implements Consumer<WsHandler> {

    @Override
    public void accept(WsHandler wsHandler) {
        wsHandler.onConnect(session -> System.out.println("Connected"));
        wsHandler.onMessage((session, message) -> {
            System.out.println("Received: " + message);
            session.getRemote().sendString("Echo: " + message);
        });
        wsHandler.onClose((session, statusCode, reason) -> System.out.println("Closed"));
        wsHandler.onError((session, throwable) -> System.out.println("Errored"));
    }
}
import io.javalin.Javalin;

public class Application {
    public static void main(String[] args) {
        Javalin app = Javalin.create().start(7000);
        app.ws("/websocket/:id", new ChatWebsocket());
        app.get("/", ctx -> ctx.result("Hello World"));
    }
}

btw. pierwszy post na forum o Javalin! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1