0
votes

I'm modernizing a JSF web application I took over from someone who retired and is not available for questions.

Current job is to simplify a h:dataTable. Each record has a commandLink to go to the corresponding details page.

Old version: action method openDetail(), determined the selected record by binding of the dataTable and looping trough the records to get the row.

New version: action method is now openDetail(Long id) and of course I added the parameter to the command link as well.

My action method is called with the correct parameter, I verified this by adding some log output. But the navigation-rule is not effective anymore. Although the action method returns the correct outcome, it stays on the page with the table.

The navigation-rule in faces-config.xml looks like this:

  <navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
      <from-action>#{myBean.openDetail}</from-action>
      <from-outcome>success</from-outcome>
      <to-view-id>/mysks/detail.xhtml</to-view-id>
      <redirect/>
    </navigation-case>
  </navigation-rule>

Do I need to adapt the navigation-rule ? Does JSF make a difference for overloaded action methods ?

1

1 Answers

1
votes

The <from-action> has to exactly match the literal string as defined in action attribute.

So if it currently looks like this:

<h:commandButton ... action="#{myBean.openDetail(detail.id)}">`

Then the <from-action> must be exactly that literal string:

<from-action>#{myBean.openDetail(detail.id)}</from-action>

However, the whole navigation rule system has not proven to be really useful in JSF and has become de-facto deprecated since release of JSF 2.0 in 2009 which introduced the new support for immediately returning the <to-view-id> as return value, called "implicit navigation". Essentially, XML-based navigation rules are really a "leftover" of the jurassic JSF 1.x and you'd best just get rid of them.

So if you simply adjust the openDetail() method from

public String openDetail(Long id) {
    // ...
    return "success";
}

to

public String openDetail(Long id) {
    // ...
    return "/mysks/detail.xhtml?faces-redirect=true";
}

then you can get rid of the entire <navigation-rule> bloat from the faces-config.xml.

See also: