Невозможно использовать f: метаданные f:viewAction из внутренних компонентов

На следующей странице я не могу загрузить automobileLists так как метод для заполнения это вне компонента в f:metadata, У меня ошибка nullPointerException. Частичный код:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>title</title>
</h:head>
<f:metadata>
    <f:viewAction action="#{primeAutomobileController.populateAutomobileFieldList}"/>
</f:metadata>

<ui:composition template="layout/template.xhtml">
    <ui:define name="content">.....................

Единственный способ загрузить его - это primeAutomobileController Для сеанса вместо исходного запроса и вызова метода с предыдущей страницы с помощью кнопки, я бы хотел, чтобы он загружался в начале страницы, не вызывая его ранее. Рассматриваемый метод:

public void populateAutomobileFieldList(){
    List<String> automobileFieldSource = new ArrayList<>();
    List<String> automobileFieldTarget = new ArrayList<>();
    automobileFieldSource.add("Make");
    automobileFieldSource.add("Model");
    automobileFieldSource.add("Year");
    automobileFieldSource.add("Description");
    setAutomobileList(new DualListModel<>
        (automobileFieldSource, automobileFieldTarget));
}

Частичная страница index.xhtml, где f:metadata загружается

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>title</title>
</h:head>
<f:metadata>
    <f:viewAction action="#{primeAutomobileController.loadAutomobiles}"/>
    <f:viewAction action="#{primeAutomobileController.populateAutomobileFieldList}"/>
</f:metadata>

<ui:composition template="layout/template.xhtml">

    <ui:define name="content"> ......................

Здесь оба метода в f:metadata загрузить должным образом, как это показано в примере в видео-учебнике, я следую, но когда это тот же самый точный код в другом xhtml, он не работает.

1 ответ

В документации тега метаданных показано, как это должно быть сделано при использовании шаблонов (как должен выглядеть шаблон и как его использовать в клиенте шаблона):

Реализация должна позволять шаблонизацию для этого элемента в соответствии со следующим шаблоном.

шаблон клиентского представления XHTML, view01.xhtml

<ui:composition template="template.xhtml">
    <ui:define name="metadata">
      <f:metadata>
        <f:viewParam name="id"/>
      </f:metadata>
    </ui:define>
    <ui:define name="content">
        <h1>The big news stories of the day</h1>
    </ui:define>
</ui:composition>

Примечание строка 4. Автор страницы должен убедиться, что <f:metadata> элемент не отображается в шаблоне или на включенной странице. Он должен находиться на корневой странице, соответствующей viewId.

Страница шаблона, template.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xml:lang="en" lang="en">

<body>
<f:view>

        <ui:insert name="metadata"/>

    <div id="container">
        <ui:insert name="content"/>
    </div>
</f:view>
</body>
</html>

Автор страницы не обязан использовать шаблоны, но если они это делают, это должно быть сделано, как показано выше

Другие вопросы по тегам