Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wildfly 8 SEAM2重定向-javax.faces.context.PartialViewContextFactory_Java_Jsf_Upgrade_Wildfly 8_Seam2 - Fatal编程技术网

Wildfly 8 SEAM2重定向-javax.faces.context.PartialViewContextFactory

Wildfly 8 SEAM2重定向-javax.faces.context.PartialViewContextFactory,java,jsf,upgrade,wildfly-8,seam2,Java,Jsf,Upgrade,Wildfly 8,Seam2,我正在迁移一个运行在legacy AS上的应用程序(其中包含大量legacy内容)。起始状态是Java1.7、JBoss5.1GA、Hibernate3、Seam2.2.2、JBPM3.9和一些遗留richfaces 我成功地将它部署在Java1.8、Wildfly 8.2、Hibernate4.3.7、Seam2.3.1和RichFaces4.5.6上。由于SEAM 2.3支持JSF2,我还将JSF升级到了2.2(Mojarra 2.2.8实现,随Wildfly提供)。由于使用SEAM,我不得

我正在迁移一个运行在legacy AS上的应用程序(其中包含大量legacy内容)。起始状态是Java1.7、JBoss5.1GA、Hibernate3、Seam2.2.2、JBPM3.9和一些遗留richfaces

我成功地将它部署在Java1.8、Wildfly 8.2、Hibernate4.3.7、Seam2.3.1和RichFaces4.5.6上。由于SEAM 2.3支持JSF2,我还将JSF升级到了2.2(Mojarra 2.2.8实现,随Wildfly提供)。由于使用SEAM,我不得不从应用服务器中删除CDI(WELD)(在standalone full.xml中注释了WELD)。还对jBPM进行了重写,使其与新的Hibernate一起工作

应用程序似乎部署正确,一切都很好(没有错误)。当我访问web界面时,登录页面加载得很好。我输入我的登录信息,然后在成功登录后,会出现一个重定向,从应用程序的深处通过如下外观调用:

import org.jboss.seam.faces.Redirect;
class C {
    public static void showPage(String page) {
        Redirect redirect = Redirect.instance();
        redirect.setViewId(page);       
        redirect.execute();
    }
}
private void redirect(String viewId, FacesContext context, String url)
   {
      url = Pages.instance().encodeScheme(viewId, context, url);
      if ( log.isDebugEnabled() )
      {
         log.debug("redirecting to: " + url);
      }
      ExternalContext externalContext = context.getExternalContext();
      controllingRedirect = true;
      try
      {  
         log.debug("Trying to get context...");
         log.debug("Contexts.getEventContext(): "+Contexts.getEventContext());
         Contexts.getEventContext().set(REDIRECT_FROM_MANAGER, "");
         log.debug("REDIRECT_FROM_MANAGER set");
         log.debug("externalContext: "+externalContext);
         externalContext.redirect( externalContext.encodeActionURL(url) );
      }
      catch (IOException ioe)
      {
         throw new RedirectException(ioe);
      }
      catch (IllegalStateException ise)
      {
          log.debug("Caught illegal state exception.");
         throw new RedirectException(ise.getMessage());
      }
      finally
      {
         Contexts.getEventContext().remove(REDIRECT_FROM_MANAGER);
         controllingRedirect = false;
      }
      context.responseComplete();
   }
通过这种方式调用,将引发异常并停止网页处理。例外情况:

SEVERE [javax.faces] (default task-8) Unable to obtain InjectionProvider from init time FacesContext. Does this container implement the Mojarra Injection SPI?
SEVERE [javax.faces] (default task-8) Application was not properly initialized at startup, could not find Factory: javax.faces.context.PartialViewContextFactory. Attempting to find backup.
...
Caused by: org.jboss.seam.faces.RedirectException: Could not find backup for factory javax.faces.context.PartialViewContextFactory. 
    at org.jboss.seam.faces.FacesManager.redirect(FacesManager.java:237) [jboss-seam.jar:2.3.1.Final]
    at org.jboss.seam.faces.FacesManager.redirect(FacesManager.java:190) [jboss-seam.jar:2.3.1.Final]
    at org.jboss.seam.faces.Redirect.execute(Redirect.java:154) [jboss-seam.jar:2.3.1.Final]
但是,还有其他重定向—所有重定向都在pages.xml中明确指定—工作正常。

没有任何冲突的库(比如广泛存在的MyFaces与Mojarra问题),只有Mojarra。也排除了这些错误:

有人知道如何解决这个问题吗?请注意,很遗憾,抛出SEAM在这里不是一个选项

我将根据要求发布更多详细信息(配置、更多信息等)。

更新: 我进行了更多的调试——直接在SEAM的FacesManager中添加一些日志记录。日志记录如下所示:

import org.jboss.seam.faces.Redirect;
class C {
    public static void showPage(String page) {
        Redirect redirect = Redirect.instance();
        redirect.setViewId(page);       
        redirect.execute();
    }
}
private void redirect(String viewId, FacesContext context, String url)
   {
      url = Pages.instance().encodeScheme(viewId, context, url);
      if ( log.isDebugEnabled() )
      {
         log.debug("redirecting to: " + url);
      }
      ExternalContext externalContext = context.getExternalContext();
      controllingRedirect = true;
      try
      {  
         log.debug("Trying to get context...");
         log.debug("Contexts.getEventContext(): "+Contexts.getEventContext());
         Contexts.getEventContext().set(REDIRECT_FROM_MANAGER, "");
         log.debug("REDIRECT_FROM_MANAGER set");
         log.debug("externalContext: "+externalContext);
         externalContext.redirect( externalContext.encodeActionURL(url) );
      }
      catch (IOException ioe)
      {
         throw new RedirectException(ioe);
      }
      catch (IllegalStateException ise)
      {
          log.debug("Caught illegal state exception.");
         throw new RedirectException(ise.getMessage());
      }
      finally
      {
         Contexts.getEventContext().remove(REDIRECT_FROM_MANAGER);
         controllingRedirect = false;
      }
      context.responseComplete();
   }
在异常发生之前记录输出:

DEBUG [org.jboss.seam.faces.FacesManager] (default task-5) redirecting to: /idm/user/personal/personal.seam?cid=2
DEBUG [org.jboss.seam.faces.FacesManager] (default task-5) Trying to get context...
DEBUG [org.jboss.seam.faces.FacesManager] (default task-5) Contexts.getEventContext(): BasicContext(EVENT)
DEBUG [org.jboss.seam.faces.FacesManager] (default task-5) REDIRECT_FROM_MANAGER set
DEBUG [org.jboss.seam.faces.FacesManager] (default task-5) externalContext: org.richfaces.context.SkinningExternalContextFactory$ExternalContextWrapperImpl@1dcafb6
DEBUG [org.jboss.seam.faces.FacesManager] (default task-5) Caught illegal state exception.
更新2:

因此,我在SEAM中处理调试消息,并且(到目前为止)发现:

DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) viewId: /adminOrUser/home.xhtml
DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) parameters: {}
DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) includeConversationId: true
DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) includePageParams: true
DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) FacesContext.getCurrentInstance: com.sun.faces.context.FacesContextImpl@67667a
DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) context.getApplication: com.sun.faces.application.ApplicationImpl@134d311
DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) context.getApplication.getViewHandler: org.jboss.as.jsf.injection.weld.WildFlyConversationAwareViewHandler@151c033
DEBUG [org.jboss.seam.faces.FacesManager] (default task-14) context.getApplication.getViewHandler.getRedirectURL: /idm/adminOrUser/home.seam
有趣的部分是
org.jboss.as.jsf.injection.weld.wildflyconversationawareviewwhandler
,这让我有些烦。为什么即使我禁用了WELD,也会有属于它的类?我没有机会进一步调查,但我的理论是,我以某种方式间接地将WELD引入到部署中,然后WELD东西会导致问题(冲突?),因为应用程序应该依赖SEAM

更新3:

焊接相关问题的概念可能是正确的。作为JSF实现,Wildfly使用集成到As中的Mojara(2.2.8)
JSF-impl-2.2.8-jbossorg-1.jar
。查看中的
模块/system/layers/base/com/sun/jsf impl/main/module.xml
,因为存在焊接依赖项:

<dependencies>
    ...
    <module name="org.jboss.weld.core"/>
    <module name="org.jboss.weld.spi"/>
</dependencies>
这意味着在WELD托管上下文中找不到id为2的对话。这并不奇怪,因为cid是由SEAM生成的,而WELD根本不知道这一点

有一篇关于让JSF与WELD一起工作的简短文档:

第二种可能是关闭WELD并更改JSF实现,这样就不会使用
JSF-impl-2.2.8-jbossorg-1.jar
(更新:这似乎不起作用。)

也可以在这里找到与该主题相关的有趣阅读:

了解发生了什么。问题出在jBPM框架中

事实是,所有工厂(ContextFactory、ApplicationFactory、PartialViewContextFactory等)在应用程序部署期间都已正确初始化,即使在GUI中移动时也已正确初始化。当我们访问启动新jBPM流程的网页时出现问题(GUI的某些部分是这样编写的,尤其是多步骤表单)

为了定位工厂,Mojarra使用FactoryFinder类,该类通过使用类加载器作为键搜索hashmap来跟踪当前工厂。当jBPM进程启动时,它将类加载器面更改为它自己的(org.jBPM.instantiation.ProcessClassLoader),这反过来又重新初始化了Mojara,并且没有为这个类加载器创建工厂。从莫哈拉的角度来看,所有的工厂都消失了。这可能是一个奇怪的例子,但是,由于我们的场景非常不标准,我们没有报告这种行为

我们通过修补Mojarra解决了这一问题,重新注册从jBPM启动的工厂不会产生任何效果,应用程序可以与部署期间创建的工厂协同工作