Websocket + Pretty Faces = AbstractMethodError - PullRequest
0 голосов
/ 06 ноября 2019

Я создаю простое приложение JSF 2.3 в Tomcat 8.5. У меня заработала сетевая розетка, а затем я добавила Pretty Faces.

Если я использую их по отдельности, они оба работают. Я имею в виду, если я удаляю зависимости Pretty Faces из pom, мой websocket работает. И если я сохраняю зависимости и удаляю <f:websocket> из своего поля зрения, Pretty Faces работает (перенаправляет нормально)!

Но, если я пытаюсь использовать Pretty Faces, пока у меня есть <f:websocket> ввид, AbstractMethodError появляется при переходе к нему. Буквально, если я прокомментирую тег, все остальное работает.

Я использую моджарру. В моем pom я использую зависимости от https://github.com/javaserverfaces/mojarra/blob/master/README.md, и значения по умолчанию для Pretty Faces.

Я предполагаю, что проблема либо в наличии конфликтующих зависимостейиз того, что я прочитал в этого ответа BalusC , или о том, что Pretty Faces и Websocket каким-то образом конфликтуют.

Любая помощь будет принята с благодарностью. Заранее спасибо.

Здесь зависимости

<!-- Java EE containers -->
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>8.0</version>
    <scope>provided</scope>
</dependency>

<!-- Servlet Containers -->
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.faces</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet-shaded</artifactId>
    <version>3.0.0.Final</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency> <!-- Optional, only when <f:websocket> is used. -->
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1</version>
</dependency>

<!-- Pretty Faces -->
<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-servlet</artifactId>
    <version>3.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-config-prettyfaces</artifactId>
    <version>3.4.2.Final</version>
</dependency>

Здесь исключение

Nov 06, 2019 1:49:39 AM com.sun.faces.context.ExceptionHandlerImpl log
FATAL: JSF1073: java.lang.AbstractMethodError caught during processing of RENDER_RESPONSE 6 : UIComponent-ClientId=, Message=null
Nov 06, 2019 1:49:39 AM com.sun.faces.context.ExceptionHandlerImpl log
FATAL: No associated message
java.lang.AbstractMethodError
    at javax.faces.application.ViewHandlerWrapper.getWebsocketURL(ViewHandlerWrapper.java:328)
    at javax.faces.application.ViewHandlerWrapper.getWebsocketURL(ViewHandlerWrapper.java:328)
    at com.sun.faces.push.WebsocketChannelManager.register(WebsocketChannelManager.java:151)
    at com.sun.faces.push.WebsocketChannelManager.register(WebsocketChannelManager.java:142)
    at com.sun.faces.push.WebsocketChannelManager$Proxy$_$$_WeldClientProxy.register(Unknown Source)
    at com.sun.faces.renderkit.html_basic.WebsocketRenderer.encodeEnd(WebsocketRenderer.java:115)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1912)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1905)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:194)
    at org.ocpsoft.rewrite.faces.RewriteViewHandler.renderView(RewriteViewHandler.java:196)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126)
    at 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)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:226)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:470)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316)
    at org.ocpsoft.rewrite.servlet.impl.HttpRewriteResultHandler.handleResult(HttpRewriteResultHandler.java:42)
    at org.ocpsoft.rewrite.servlet.RewriteFilter.rewrite(RewriteFilter.java:297)
    at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:198)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    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)

Ответы [ 2 ]

4 голосов
/ 06 ноября 2019

Обновление:

Согласно комментарию Линкольна, новый релиз PrettyFaces 3.4.3 поддерживает JSF 2.3. Помимо других изменений, теперь он делает RewriteViewHandler расширением ViewHandlerWrapper, как предлагает BalusC.


Фон:

Это выглядиткак PrettyFaces 3.4.2 не полностью совместима с JSF 2.3.

Неабстрактный класс org.ocpsoft.rewrite.faces.RewriteViewHandler.RewriteViewHandler расширяет javax.faces.application.ViewHandler, но не переопределяет абстрактный метод getWebsocketURL.

Вы можете легковоспроизведите это с красивыми лицами и API JSF 2.3 на пути к классам:

package my.pkg;

import org.ocpsoft.rewrite.faces.RewriteViewHandler;

public class PrettyFacesTest {
    public static void main(String[] args) {
        new RewriteViewHandler(null).getWebsocketURL(null, null);
    }
}

Результат:

Exception in thread "main" java.lang.AbstractMethodError: org.ocpsoft.rewrite.faces.RewriteViewHandler.getWebsocketURL(Ljavax/faces/context/FacesContext;Ljava/lang/String;)Ljava/lang/String;
    at my.pkg.PrettyFacesTest.main(PrettyFacesTest.java:7)

RewriteViewhandler зарегистрирован в rewrite-integration-faces-3.4.2.Final.jar/META-INF/faces-config.xml:

<application>
    <navigation-handler>org.ocpsoft.rewrite.faces.RewriteNavigationHandler</navigation-handler>
    <view-handler>org.ocpsoft.rewrite.faces.RewriteViewHandler</view-handler>
</application>

Я не уверен, есть ли шанс предотвратить эту регистрацию. Если это так, вы можете создать CustomRewriteViewHandler, который расширяет RewriteViewHandler, переопределяет getWebsocketURL и делегатов, которые вызывают super.parent:

import javax.faces.application.ViewHandler;
import javax.faces.context.FacesContext;

import org.ocpsoft.rewrite.faces.RewriteViewHandler;

public class CustomRewriteViewHandler extends RewriteViewHandler {
    public CustomRewriteViewHandler(ViewHandler viewHandler) {
        super(viewHandler);
    }

    @Override
    public String getWebsocketURL(FacesContext context, String channel) {
        return super.parent.getWebsocketURL(context, channel);
    }
}

Затем вы зарегистрируете этот CustomRewriteViewHandler вместо исходного:

<application>
    <view-handler>my.pkg.CustomRewriteViewHandler</view-handler>
</application>

Как BalusC описывает здесь , вы не можете заблокировать части faces-config.xml из включенного jar. Вместо этого вы можете установить <faces-config ... metadata-complete="true">, что не приведет к обработке ни faces-config.xml, ни аннотаций для любых включенных jar с, что будет стоить так, что вам потребуется переопределить все материалы для 3d-вечеринок, необходимые в вашем faces.config.xml.

1 голос
/ 08 ноября 2019

Как обнаружил @Selaron, проблема заключалась в том, что PrettyFaces не поддерживает WebScket JSF 2.3, поскольку класс RewriteViewHandler не реализует метод getWebsocketURL. Вот его решение к проблеме.

Как только он указал на это, я разветвил PrettyFaces ( ocpsoft / rewrite ) и обнаружил, что JSF 2.3 вообще не поддерживается. ,Поэтому я попытался обновить JSF до 2.3, который казался чище (по крайней мере, мне), чем ответ @ Selaron.

Вот коммит работающей вещи. Я не буду вдаваться в подробности того, что мне пришлось изменить (которые объясняются в коммите).

И последнее. Как я упоминал в своем вопросе, единственными двумя зависимостями, которые я использовал для включения в pom.xml для PrettyFaces, являются значения по умолчанию .

Но когда я строю проект в своей локальной среде,Мне нужно было добавить еще немного.

Вот они

<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-impl-servlet</artifactId>
    <version>3.4.3-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-config-prettyfaces</artifactId>
    <version>3.4.3-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-api-servlet</artifactId>
    <version>3.4.3-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-annotations-impl</artifactId>
    <version>3.4.3-SNAPSHOT</version>
</dependency>

Клонирование / загрузка из моей ветки ocpsoft / rewrite, установка проекта локально и добавление этих зависимостей в pom.xmlПозвольте вам заставить веб-сокет PrettyFaces + JSF 2.3 работать.

PS - Я неохотно отмечаю любой из ответов как принятый прямо сейчас. (Я попробую @ Selaron's и тогда решу).

...