Компонент метаданных должен быть вложен в тег f: metadata. Предложение: заключить необходимые компоненты в <f: metadata>

Я просмотрел разные источники, например:

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

template.xhtml:

<!DOCTYPE html>
<html lang="#{languageBean.language}"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
    xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"
    xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">
<!-- Enables CTRL+SHIFT+D for activating Facelets debug window -->
<ui:debug />
<f:view locale="#{languageBean.language}" encoding="UTF-8" contentType="text/html">
<!-- Client templates can insert f:metadata here, and this will NOT show up in the showcase page source code -->
<ui:insert name="meta" />

<c:set var="contextPath" value="${pageContext.request.contextPath}"
    scope="application" />
<f:loadBundle var="messageResource" basename="MessageResource" />
<h:head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <meta http-equiv="X-UA-Compatible"
        content="EmulateIE8,IE=edge,chrome=1" />
    <meta http-equiv="pragma" content="no-cache" />
    <meta http-equiv="cache-control" content="no-cache" />
    <meta http-equiv="expires" content="0" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="description" content="Connect" />
    <meta name="keywords"
        content="timeline, 3d, css, css3, css-only, transitions, responsive, fluid" />
    <meta name="author" content="FriendsMirror" />
    <link rel="shortcut icon"
        href="#{request.contextPath}/Friendsmirror.ico" />
    <ui:insert name="js"/>  
    <h:outputStylesheet library="css" name="common.css" />
    <h:outputStylesheet library="css" name="main.css" />
    <ui:insert name="css"/>

    <ui:insert name="onloadScript"/>
    <title><ui:insert name="title">#{messageResource['connect.main.title.main.title']}</ui:insert></title>
</h:head>
<h:body>
<ui:insert name="content" />
</h:body>
</f:view>
</html>

Page:

<ui:composition template="/WEB-INF/templates/discussion_layout.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">

    <ui:define name="meta">
        <f:metadata>
            <f:viewParam name="sessionKey" value="#{discussionWrapperBean.sessionKey}" />
            <f:viewParam name="ref" value="#{discussionWrapperBean.ref}" />
            <f:viewParam name="pId" value="#{discussionWrapperBean.pId}" />
            <f:viewParam name="dId" value="#{discussionWrapperBean.discussionId}" />
            <f:viewParam name="dName" value="#{discussionWrapperBean.discussionName}" />
            <f:viewAction action="#{discussionWrapperBean.loadInitDiscussion}" onPostback="false" />
        </f:metadata>
    </ui:define>

    <ui:define name="title">
        <ui:fragment rendered="#{discussionWrapperBean.profileId != null}">
            #{discussionWrapperBean.userBean.firstName} #{discussionWrapperBean.userBean.lastName != null ? discussionWrapperBean.userBean.lastName: ''}#{discussionWrapperBean.pageTitleNotifications != null ? '(' : ''}#{discussionWrapperBean.pageTitleNotifications != null ? discussionWrapperBean.pageTitleNotifications : ''}#{discussionWrapperBean.pageTitleNotifications != null ? ')' : ''}
        </ui:fragment>
        <ui:fragment rendered="#{discussionWrapperBean.profileId == null}">
            #{messageResource['connect.discussion.title']}
        </ui:fragment>
    </ui:define>

    <ui:define name="content">

    </ui:define>

</ui:composition>

Maven:

<jsf.version>2.2.1</jsf.version>

<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>${jsf.version}</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>${jsf.version}</version>
    <scope>provided</scope>
</dependency>

В Ui я получаю вопрос вроде: The metadata component needs to be nested within a f:metadata tag. Suggestion: enclose the necessary components within <f:metadata>

даже если он не вызывает <f:viewAction>

Любое предложение или помощь будут оценены.

Одна вещь, которую я заметил во время развертывания: INFO: Инициализация Mojarra 2.2.0 (20130502-2118 https://svn.java.net/svn/mojarra~svn/tags/[email protected]) для контекста /connectWAR

Я не уверен, почему это говорит Mojarra 2.2.0, хотя я обновил до 2.2.1

Ответ 1

Что касается ложного предупреждения пользовательского интерфейса, это вызвано Mojarra issue 2868 и уже исправлено с 2.2.1.

Что касается <f:viewAction>, который все еще не работает с 2.2.1, другой ошибкой Mojarra, поскольку Java EE 7 ввел доменное пространство доменов xmlns.jcp.org XML, вызывает эту проблему. В частности, версии Mojarra 2.2.0 и 2.2.1 новый домен пространства имен XML неправильно зарегистрирован для всех новых тегов JSF 2.2, которые не существовали в JSF 2.0/2.1, например <f:viewAction>. В эффектах xmlns.jcp.org даст вам в Mojarra 2.2.0/2.2.1 только теги, совместимые с JSF 2.1. Это полностью объясняет, почему новый JSF 2.2 <f:viewAction> не работал для вас.

У вас есть 2 варианта:

  • Вместо этого используйте "старый" java.sun.com XML-пространство имен. Новые специальные теги JSF 2.2 правильно зарегистрированы там.

  • Обновите, по крайней мере, Mojarra 2.2.2. Эта особенная ошибка исправлена ​​с этой версии. Mojarra в настоящее время уже в 2.2.4.