Search code examples
jsf-2prettyfaces

Dynamic view id using pretty faces navigation refuses to work


I am attempting to migrate an application from JSF 1.2 to JSF 2.1. The code below worked in the 1.2. I am using PrettyFaces 3.3.3, MyFaces 2.1.

in 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>

I have a request with URL: http://example.com/myapp/sites/object/309847 This request successfully matches the url mapping id "seSite" and getSiteViewId is invoked on seViewChooserBean and returns the result "pretty:seSiteProps". I have debugged and confirmed this. For your reference this is the bean code for ViewChooserBean.java:

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";
    }
}

After that prettyfaces then attempts to forward to the new view id seSiteProps but the new generated URL is not processed by pretty faces because (from the logs): "Request is not mapped using PrettyFaces. Continue."

So I get 404 response for URL http:://example.com/myapp/sites/object/309847/properties.

Note that this url match to view id seSiteProps.

I have debugged this up into the pretty faces filter and discovered the following:

After the initial request for http://example.com/myapp/sites/object/309847, the DynaviewEngine.processDynaView is invoked and generates the correct target url http:://example.com/sites/object/309847/properties and forwards via faces request.

Then, with a breakpoint in PrettyFilter.doFilter() I observed the following: In PrettyFilter.doFilter() method: isUrlMappingForward(req) returns false, therefore request is not processed by prettyfaces. Why??

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

Also, note that if I put the request http:://example.com/myapp/sites/object/309847/properties directly in the browser the page IS processed by prettyfaces and isUrlMappingForward(req) returns true and it loads correctly in the browser.

I was thinking I've missed something obvious here as the problem hasn't been reported elsewhere as far as I can tell. Any help is greatly appreciated. Thanks. Brett


Solution

  • Actually I'm very surprised that returning PrettyFaces navigation strings from dynaview methods ever worked. This isn't documented anywhere and I doubt that this has been tested in detail. So basically you are using the dynaview feature in an very weird way.

    So I recommend to return plain JSF view IDs instead which should work fine. See the documentation for details:

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