使用漂亮面孔导航的动态视图id拒绝工作



我正试图将一个应用程序从JSF 1.2迁移到JSF 2.1。下面的代码在1.2中起作用。我使用的是PrettyFaces 3.3.3,MyFaces 2.1。

在pretty-config.xml中:

<url-mapping id="seSite">
  <pattern value="/sites/#{seViewChooserBean.urlSiteType}/#{seViewChooserBean.siteId}"/>
  <view-id value="#{seViewChooserBean.getSiteViewId}"/>
</url-mapping>
<url-mapping id="seSiteProps">
  <pattern value="/sites/#{sePropsBean.urlSiteType}/#{sePropsBean.siteId}/properties"/>
  <view-id value="/pages/se/site/props.xhtml"/>
  <action>#{sePropsBean.init}</action>
</url-mapping>

我有一个URL为的请求:http://example.com/myapp/sites/object/309847此请求成功匹配url映射id"seSite",并在seViewChooserBean上调用getSiteViewId,并返回结果"漂亮:seSiteProps"。我已经调试并确认了这一点。这是ViewChooserBean.java的bean代码,供您参考

public String getSiteViewId() {
    if (siteType == SiteType.TYPE) {
        // redirect to tag list view
        initSiteBean("seTagListBean", TagListBean.class);
        return "pretty:seTagList";
    }
    else {
        // redirect to site properties view
        initSiteBean("sePropsBean", PropertiesBean.class);
        return "pretty:seSiteProps";
    }
}

之后,prettyfaces尝试转发到新的视图id seSiteProps,但新生成的URL没有被prettyface处理,因为(从日志中):"请求没有使用prettyfaces.继续。"

因此,我收到了URL http://example.com/myapp/sites/object/309847/properties的404响应。

请注意,此url与视图id seSiteProps匹配。

我已经将其调试到漂亮面孔过滤器中,并发现了以下内容:

在最初请求http://example.com/myapp/sites/object/309847,DynaviewEngine.processDynaView被调用并生成正确的目标url http://example.com/sites/object/309847/properties,并通过faces请求转发。

然后,在PrettyFilter.doFilter()中使用断点,我观察到以下内容:在PrettyFilter.doFilter()方法中:isUrlMappingForward(req)返回false,因此请求不由prettyfaces处理。为什么?

// isUrlMappingForward returns false.  The request has url http:://example.com/myapp/sites/object/309847/properties on it.
if (!isUrlMappingForward(req))
{
  mapping = getConfig().getMappingForUrl(url);
}

此外,请注意,如果我将请求http://example.com/myapp/sites/object/309847/properties直接放在浏览器中,则由prettyfaces和isUrlMappingForward(req)处理的页面将返回true,并在浏览器中正确加载。

我想我错过了一些显而易见的东西,因为据我所知,其他地方还没有报道这个问题。非常感谢您的帮助。谢谢Brett

事实上,我非常惊讶从dynaview方法返回PrettyFaces导航字符串是否有效。这在任何地方都没有记录,我怀疑这是否经过了详细的测试。所以基本上你是在以一种非常奇怪的方式使用动态视图功能。

因此,我建议返回普通的JSF视图ID,这应该可以正常工作。有关详细信息,请参阅文档:

http://ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/Configuration.html#config.dynaview

最新更新