Переопределение правила навигации JSF 2.0 в файле JAR - PullRequest
1 голос
/ 07 января 2012

Предположим следующее:

В файле JAR у вас есть файл META-INF / Face-config.xml со следующим правилом навигации:

 <navigation-rule>
  <from-view-id>/path/page1.xhtml</from-view-id>
  <navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/path/result.xhtml</to-view-id>
  </navigation-case>
 </navigation-rule>

И я хотел быпереопределите это правило навигации в моем веб-приложении, поэтому я поместил следующее правило навигации в WEB-INF /face-config.xml следующим образом:

 <navigation-rule>
  <from-view-id>/path/page1.xhtml</from-view-id>
  <navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/path/my_custom_result.xhtml</to-view-id>
  </navigation-case>
 </navigation-rule>

Поэтому, когда я нахожусь на странице / path/page1.xhtml и результатом действия является success Я полагаю, что навигационный случай в WEB-INF /face-config.xml является результатом (то есть /path/my_custom_result.xhtml), но, к сожалению,Результатом является тот, который находится в jar-файле META-INF /face-config.xml (т.е. /path/result.xhtml).Хотя, глядя на код, эти два случая находятся в java.util.Set, поэтому порядок даже не гарантирован!

Первый вопрос: вы думаете, это ошибка?хотя в спецификации JSF эта ситуация не упоминается, но я думаю, что имеет смысл, чтобы локальные конфигурации face-config.xml переопределяли конфигурации в файлах jar.

Второй вопрос: я знаю, что могусоздать пользовательский NavigationHandler, но, глядя на com.sun.faces.application.NavigationHandlerImpl Я не понял, как я мог узнать, из какого файла Face-config.xml приходит NavigationCase.

Есть идеи или предложения?

Спасибо, ребята.


Относительно ответа Eelke:

Это документация ADF, я искал спецификацию JSF 2.0, котораявы можете найти здесь: http://download.oracle.com/otndocs/jcp/jsf-2.0-fr-eval-oth-JSpec/ и там я нашел следующую строку

It is an error to specify more than one <navigation-case>,nested
within one or more <navigation-rule> elements with the same
<from-view-id>matching pattern, that have exactly the same combination
of <from-xxx>, unless each is discriminated by a unique <if> element.

, которая заставляет меня думать, что то, что я пытаюсь сделать, невозможно, хотя некоторые реализации JSF могут иметь немного другоеповедение в этой ситуации (например, ADF).

Относительно дубликатов метод NavigationCase.equals проверяет, что все атрибуты одинаковы, и в моем случае toViewID отличается, поэтому они не равны.

1 Ответ

1 голос
/ 08 января 2012

На этой странице четко указано в пункте 9.2.4.3 второго псевдонима:

Если существует конфликт, в котором два или более случаев имеют одинаковые значения from-view-id, from-action и from-result, последний случай (как они перечислены в face-config.xml). Если конфликт среди правил, определенных в разных файлах конфигурации, правило в последний загружаемый файл конфигурации. Конфигурационные файлы загружаются в порядке их появления в файле web.xml.

И эта страница ясно указывает внизу:

Если приложение использует несколько файлов конфигурации JSF, во время выполнения JSF находит и загружает параметры конфигурации приложения в следующий порядок:

Ищет файлы с именем META-INF /face-config.xml в любых файлах JAR. для приложения, и загружает каждый как ресурс конфигурации (в обратный порядок порядка, в котором они находятся).

Поиск параметра контекста javax.faces.CONFIG_FILES, установленного в файл web.xml приложения. JSF затем загружает каждый именованный файл как ресурс конфигурации.

Поиск файла с именемface-config.xml в каталоге WEB-INF и загружает его как ресурс конфигурации.

Таким образом, это может показаться ошибкой, или у вас есть что-то не совсем правильное, что приводит к тому, что он не загружает правила в ваш WEB-INF /face-config.xml. У вас есть варианты навигации, которые действительно работают? Вы также можете проверить свои журналы. Иногда приложение успешно развертывается, но есть некоторые предупреждения о том, что что-то игнорируется или не совсем верно.

Кстати, Набор может не определять порядок, но он не допускает дублирование, поэтому должно быть только одно совпадение. А именно последнее значение, вставленное для ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...