关于扩展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
答案 0 :(得分:0)
自发布此问题以来,我研究了Tapestry-IoC及其工作方式。事实证明,返回的内容看起来有些奇怪($ HarbourServerEndpoint_39c9cc24eb8b2a),这是有原因的。它是一个服务代理对象,而不是我所期望的服务实现实例。我不确定这对于IoC容器有多典型。从Tapestry网站上报价:
“服务由两个主要部分组成:服务接口和服务实现。
服务接口是在整个注册表其余部分中如何表示服务的方式。由于传递过来的通常是代理,因此您不能期望将服务对象转换为实现类(您将看到ClassCastException)。换句话说,您应该谨慎确保服务界面完整,因为Tapestry IoC可以有效地将您从演员阵容等后门撤离。”
这使得从IoC注册表实例获取带有@ServerEndpoint注释的类非常棘手,我现在正在探索其他选项。
此致
克里斯。