我在渲染 f:websocket 组件时遇到问题。服务器是Tomcat v8.5。
关于链接中的说明:
http://balusc.omnifaces.org/2013/10/how-to-install-cdi-in-tomcat.html
如何在 Spring 应用程序中使用 Maven 将 JSF 2.2 更新到 JSF 2.3
https://blog.payara.fish/jsf-2.3-the-websocket-quickstart-under-payara-server
Maven依赖项是:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet-shaded</artifactId>
<version>3.0.3.Final</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>6.2</version>
</dependency>
这是 test.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h:form>
<h:outputText value="#{pisSocketView.count}" styleClass="display" />
<p:commandButton value="Click"
actionListener="#{pisSocketView.increment}" />
<f:websocket channel="counter" onmessage="handleMessage" />
</h:form>
<script type="text/javascript">
function handleMessage(message, channel, event) {
$('.display').text(message);
}
</script>
</h:body>
</html>
当我加载页面时出现错误:
java.lang.AbstractMethodError 在 javax.faces.application.ViewHandlerWrapper.getWebsocketURL(ViewHandlerWrapper.java:328) 在 javax.faces.application.ViewHandlerWrapper.getWebsocketURL(ViewHandlerWrapper.java:328) 在 com.sun.faces.push.WebsocketChannelManager。在 com.sun.faces.push.WebsocketChannelManager$Proxy$_$$_WeldClientProxy.register(未知来源) 在 com.sun.faces.push.WebsocketChannelManager.register(WebsocketChannelManager.java:142) 注册(WebsocketChannelManager.java:151)在 com.sun.faces.renderkit.html_basic.WebsocketRenderer.encodeEnd(WebsocketRenderer.java:115) 在 javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949) 在 javax.faces.component.UIComponent.encodeAll(UIComponent .java:1912) 在 javax.faces.render.Renderer.encodeChildren(Renderer.java:176) 在 javax.faces.component。UIComponentBase.encodeChildren(UIComponentBase.java:918) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1905) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908) 在 javax.faces.component .UIComponent.encodeAll(UIComponent.java:1908) 在 com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491) 在 com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java :194) 在 org.ocpsoft.rewrite.faces.RewriteViewHandler.renderView(RewriteViewHandler.java:186) 在 javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151) 在 javax.faces.application.ViewHandlerWrapper.renderView( ViewHandlerWrapper.java:151) 在 com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:223) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:第671章.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:205) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 在 org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org. springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:193) 在 org.apache.catalina.core。ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter .java:197) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina 的 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)。核心.ApplicationFilterChain。doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:117) at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:61 ) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.boot.web 的 org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:92) .support.ErrorPageFilter.doFilter(ErrorPageFilter.java:110) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166 ) 在 org.apache.catalina.core 的 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)。StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org .apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve .java:87) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) 在 org.apache.coyote。 AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 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) 在 java.lang.Thread.run(Thread.java:748)tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)