簡體   English   中英

將自定義配置器與 WebSockets 結合使用

[英]Using custom Configurator with WebSockets

只是一個關於擴展 ServerEndpointConfig.Configurator 以覆蓋 Tomcat 的默認操作的快速問題,即在接收 WebSocket 請求時實例化用 @ServerEndpoint 注釋的 POJO 類。 我這樣做的原因是我的端點類依賴於 IoC 依賴注入,因此需要從注冊表中獲取它的依賴項。

我的配置器方法:

@Override 
public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException { 
    return endpointClass.cast(RegistryProxy.getService(HarbourServerEndpoint.class)); 
} 

@ServerEndpoint 注釋放在我的 HarbourServerEndpointImpl POJO 類上,而不是它實現的接口上。 根據下面的運行時 catalina.out 錯誤消息,問題似乎是注冊表返回 HarbourServerEndpoint 而 Tomcat 期待 HarbourServerEndpointImpl 的實例?

我希望有人可以解釋我的自定義配置器出了什么問題。

2019 年 4 月 15 日 12:45:28.488 嚴重 [http-nio-8080-exec-915] org.apache.coyote.AbstractProtocol$ConnectionHandler.process 讀取請求時出錯,忽略 java.lang.ClassCastException:無法將 $HarbourServerEndpoint_39c92acc24eb8 .optomus.harbour.services.HarbourServerEndpointImpl at java.lang.Class.cast(Class.java:3369) at com.optomus.harbour.services.HarbourServerEndpointConfigurator.getEndpointInstance(HarbourServerEndpointConfigurator.java:17) at org.apache.tomcat.websocket .pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:44)

 at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:133) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:846) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

最后,完全沒有強制轉換,編譯器給出了錯誤:

 Error:(17, 40) java: incompatible types: inference variable T has incompatible bounds equality constraints: com.optomus.harbour.services.HarbourServerEndpoint upper bounds: T,java.lang.Object

自從發布這個問題以來,我研究了 Tapestry-IoC 及其工作原理。 原來返回的內容看起來有點奇怪是有原因的($HarbourServerEndpoint_39c9cc24eb8b2a)。 它是一個服務代理對象,而不是我所期望的服務實現的實例。 我不確定這對於 IoC 容器來說有多典型。 引自 Tapestry 網站:

“服務由兩個主要部分組成:服務接口和服務實現。

服務接口是服務在整個注冊中心其余部分的表示方式。 由於傳遞的通常是代理,因此您不能指望將服務對象強制轉換為實現類(您將看到 ClassCastException)。 換句話說,您應該小心確保您的服務接口是完整的,因為 Tapestry IoC 有效地將您與后門(例如演員表)隔離開來。”

這使得從使用 @ServerEndpoint 注釋的類的 IoC 注冊表實例獲取變得相當棘手,我現在正在探索其他選項。

問候,

克里斯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM