Dynamic view id using pretty faces navigation refuses to work

陌路散爱 提交于 2019-12-12 02:03:57

问题


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


回答1:


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



来源:https://stackoverflow.com/questions/26290077/dynamic-view-id-using-pretty-faces-navigation-refuses-to-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!