2017-09-29 3 views
1

In der folgenden Seite kann ich automobileLists nicht laden, da die Methode zum Auffüllen außerhalb der Komponente in einem f:metadata ist. Ich habe einen NullPointerException-Fehler. Teilcode:Kann nicht verwendet werden f: Metadaten f: viewAction von innerhalb von Komponenten

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

Der einzige Weg für mich, um Spielraum zu laden ist die primeAutomobileController zu Sitzung statt der ursprünglichen Anfrage, und rufen Sie die Methode von einer vorhergehenden Seite über eine Schaltfläche, ich mag es laden am Anfang der Seite, anstatt sie vorher aufzurufen. Das Verfahren in Frage:

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)); 
} 

Teil index.xhtml Seite, wo f:metadata

geladen wird
<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"> ...................... 

hier beide Methoden in f:metadata richtig geladen werden, wie es in einem Beispiel in einem Video-Tutorial gezeigt ist i folge, aber wenn es genau der gleiche Code in einem anderen xhtml ist, funktioniert es nicht.

Antwort

1

Die Dokumentation von metadata tag zeigt, wie es getan werden muss, bei der Verwendung von Templat (wie die Vorlage aussehen muss und wie es in der Vorlage-Client verwenden):

Die Umsetzung Templating für dieses Element zulassen muss nach das folgende Muster.

Template Client XHTML Ansicht, 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> 

Hinweis Linie 4. Die Seite Autor muss sicherstellen, dass das <f:metadata> Element nicht auf einer Vorlage angezeigt wird oder enthalten Seite. Sie muss sich auf der Stammwebseite befinden, die der ViewId entspricht.

Die Vorlage Seite, 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> 

Die Seite Autor nicht Templat verwenden erforderlich ist, aber wenn sie es tun, es muss über

+0

I‘, wie gezeigt durchgeführt werden Ich habe versucht, dem Beispiel zu folgen, aber es lädt mich immer noch nicht, ich fügte in der Post meine 'index.xhtml' Seite hinzu, wo genau der gleiche Code geladen wird. – MrSir

+0

@mrsir: Hast du die Antwort gelesen und die Antwort mit deinem Code verglichen? – Kukeltje