JSF: правило навигации перестало работать после добавления параметра в метод действия

Я модернизирую веб-приложение JSF, которое я взял на себя от человека, который вышел на пенсию и недоступен для вопросов.

Текущая задача — упростить h:dataTable. Каждая запись имеет commandLink для перехода на соответствующую страницу сведений.

Старая версия: метод действия openDetail() определял выбранную запись путем привязки таблицы данных и перебора записей для получения строки.

Новая версия: метод действия теперь называется openDetail(Long id), и, конечно же, я также добавил этот параметр в ссылку на команду.

Мой метод действия вызывается с правильным параметром, я проверил это, добавив некоторый вывод журнала. Но правило навигации больше не действует. Хотя метод действия возвращает правильный результат, он остается на странице с таблицей.

Правило навигации в faces-config.xml выглядит следующим образом:

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

Нужно ли адаптировать правило навигации? Влияет ли JSF на перегруженные методы действий?


person user9964388    schedule 24.02.2021    source источник


Ответы (1)


<from-action> должен точно соответствовать литеральной строке, как определено в атрибуте action.

Итак, если в настоящее время это выглядит так:

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

Тогда <from-action> должна быть именно этой строкой:

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

Однако вся система правил навигации не оказалась действительно полезной в JSF и стала де-факто устаревшей после выпуска JSF 2.0 в 2009 году, в котором появилась новая поддержка для немедленного возврата <to-view-id> в качестве возвращаемого значения, называемая неявной навигацией. По сути, правила навигации на основе XML — это остатки юрского периода JSF 1.x, и вам лучше просто избавиться от них.

Итак, если вы просто настроите метод openDetail() из

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

to

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

тогда вы можете избавиться от всего <navigation-rule> наворота из faces-config.xml.

Смотрите также:

person BalusC    schedule 24.02.2021
comment
Этому веб-приложению более 10 лет, и изначально оно было реализовано в JSF 1.1. Я надеюсь, что мне также одобрят бюджет на модернизацию навигации. С другой стороны... Мне понравилась концепция централизованной конфигурации навигации, в отличие от неявной навигации, о которой я только что узнал, когда идентификаторы to-view разбросаны по всему веб-приложению. Усложняет поддержание IMO. - person user9964388; 24.02.2021