【问题标题】:Play 2.5 ActorFlow: cannot convert from Flow<String,String,capture#1-of ?> to Flow<String,String,?>播放 2.5 ActorFlow:无法从 Flow<String,String,capture#1-of ?> 转换为 Flow<String,String,?>
【发布时间】:2025-12-01 14:50:01
【问题描述】:

在迁移到 Play 2.5 时,我正在尝试实现新的 WebSocket 功能,如 here(使用演员处理 WebSocket)所述。在 Play 2.5.4 中没有 play.libs.streams.ActorFlow(如示例所示),而只有 play.api.libs.streams.ActorFlow。但是当我写这段代码时:

public class MyController extends Controller {
    private final ActorSystem actorSystem;
    private final Materializer materializer;

    @Inject
    public MyController(ActorSystem actorSystem, Materializer materializer) {
        this.actorSystem = actorSystem;
        this.materializer = materializer;
    }

    public WebSocket socket() {
        return WebSocket.Text.accept(request ->
                return ActorFlow.<String, String>actorRef(MyWebSocketActor::props, 256, OverflowStrategy.dropHead(),
                    actorSystem, materializer
                )
        );
    }
}

编译器给我一个错误:

类型不匹配:无法从 Flow&lt;String,String,capture#1-of ?&gt; to Flow&lt;String,String,?&gt; 转换

有人可以解释一下如何在 2.5 中实现这种方法吗?为什么会出现这个错误?

【问题讨论】:

    标签: java playframework akka-stream playframework-2.5 type-mismatch


    【解决方案1】:

    我刚刚在 Play 2.5.12 中遇到了同样的问题。问题似乎是在 Play 2.5.x 中还没有为 Java 正确实现 ActorFlow。 (这正是您从 Scala 方面获得 play.api.libs.streams.ActorFlow 的原因)。

    正确的 Java 代码似乎适用于 Play 2.6.x。 https://github.com/playframework/playframework/blob/master/framework/src/play-streams/src/main/java/play/libs/streams/ActorFlow.java

    目前,我想最简单的解决方案是坚持使用(已弃用的)LegacyWebsocket,直到 2.6.x 稳定为止。

    (我知道这是一个老问题,但它仍然相关)。

    【讨论】:

    • 感谢您的回复:) 但是,我找到了在 Play 2.5 中利用新 WebSocket 实现的方法,基于此处所写的内容:nuah.livejournal.com/315561.html
    最近更新 更多