将自定义配置器与WebSockets一起使用

时间:2019-04-18 02:25:27

标签: java tomcat websocket

关于扩展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_39c9cc24eb8b2a至   com.optomus.harbour.services.HarbourServerEndpointImpl           在java.lang.Class.cast(Class.java:3369)           在com.optomus.harbour.services.HarbourServerEndpointConfigurator.getEndpointInstance(HarbourServerEndpointConfigurator.java:17)           在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

1 个答案:

答案 0 :(得分:0)

自发布此问题以来,我研究了Tapestry-IoC及其工作方式。事实证明,返回的内容看起来有些奇怪($ HarbourServerEndpoint_39c9cc24eb8b2a),这是有原因的。它是一个服务代理对象,而不是我所期望的服务实现实例。我不确定这对于IoC容器有多典型。从Tapestry网站上报价:

“服务由两个主要部分组成:服务接口和服务实现。

服务接口是在整个注册表其余部分中如何表示服务的方式。由于传递过来的通常是代理,因此您不能期望将服务对象转换为实现类(您将看到ClassCastException)。换句话说,您应该谨慎确保服务界面完整,因为Tapestry IoC可以有效地将您从演员阵容等后门撤离。”

这使得从IoC注册表实例获取带有@ServerEndpoint注释的类非常棘手,我现在正在探索其他选项。

此致

克里斯。