Отключить RestorableViewHandler в Omnifaces

Я использую OmniFaces 1.10 и Apache MyFaces 2.2.6 вместе в большом веб-приложении. Когда приложение запускается в производстве, я получаю ложные исключения в следующей форме в журнале веб-сервера (Tomcat):

java.lang.NullPointerException
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver$5.put(ManagedBeanResolver.java:101)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.putInScope(ManagedBeanResolver.java:367)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.createManagedBean(ManagedBeanResolver.java:340)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.getValue(ManagedBeanResolver.java:296)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:179)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72)
at org.apache.el.parser.AstValue.getValue(AstValue.java:147)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:96)
at org.apache.myfaces.view.facelets.tag.TagAttributeImpl.getObject(TagAttributeImpl.java:431)
at org.apache.myfaces.view.facelets.tag.TagAttributeImpl.getBoolean(TagAttributeImpl.java:143)
at org.apache.myfaces.view.facelets.tag.jstl.core.ChooseWhenHandler.isTestTrue(ChooseWhenHandler.java:68)
at org.apache.myfaces.view.facelets.tag.jstl.core.ChooseHandler.apply(ChooseHandler.java:182)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:46)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:55)
at org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:373)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:50)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:46)
at org.apache.myfaces.view.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:195)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:46)
at org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:59)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:46)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:46)
at org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:48)
at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:520)
at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:574)
at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:552)
at org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:240)
at org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:151)
at org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:59)
at org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:48)
at org.apache.myfaces.view.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:188)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:477)
at org.omnifaces.viewhandler.RestorableViewHandler.restoreView(RestorableViewHandler.java:80)
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:170)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:196)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:143)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

Я уверен, что это проблема или, по крайней мере, пограничный случай в приложении (например, файл .xhtml, который неправильно использует некоторые переменные bean-компонента), но я не могу воспроизвести это в тестовых примерах, и это также никогда не случалось с предыдущими версиями MyFaces и OmniFaces.

Само исключение, по-видимому, вызвано тем, что OmniFaces «RestorableViewHandler» пытается восстановить представление, просто чтобы увидеть, содержит ли оно тег, который должен быть восстановлен автоматически. Когда восстановленный вид не содержит тега, он отбрасывает (уже) восстановленный вид. Помимо очевидной проблемы с производительностью, это также вызывает это исключение NullPointerException, поэтому я не хочу этого, и поэтому я ищу способ полностью отключить RestorableViewHandler. Я знаю, что когда я это сделаю, я не смогу использовать тег "enableRestorableView", но это нормально.


person Markus    schedule 16.01.2015    source источник
comment
В RestorableViewHandler почти 2 года технически ничего не менялось. Я бы предположил, что проблема связана с MyFaces. Построение среднего представления должно занимать не более 0,05~0,15 мс на современном серверном оборудовании. Однако история действительно меняется, когда управляемые компоненты участвуют в создании представления (через обработчики тегов и т. д.), и эти управляемые компоненты не используются на странице ошибки исключения с истекшим сроком действия представления. Желание отключить его тогда понятно.   -  person BalusC    schedule 16.01.2015


Ответы (1)


Его невозможно отключить без взлома исходного кода OmniFaces. В соответствии с проблемой 92, это было исправлено, позволив <o:enableRestorableView> установить атрибут приложения после того, как он был где-то используется, чтобы RestorableViewHandler мог решить, пытаться восстановить представление или нет.

Обратите внимание, что я действительно предпочел бы динамическую регистрацию RestorableViewHandler, однако невозможно динамически зарегистрировать ViewHandler, когда приложение уже обрабатывало запрос ранее. Это вызвать только IllegalStateException.

Исправление доступно в сегодняшнем снимке версии 1.11 ( и снимок 2.1 для пользователей 2.x. ).

person BalusC    schedule 16.01.2015
comment
Вау, это было быстро. Большое спасибо. Есть ли сроки для выпуска 1.11, чтобы мы могли использовать его с помощью Maven? - person Markus; 16.01.2015
comment
Когда мы чувствуем, что это нуждается в освобождении. - person BalusC; 16.01.2015