F: viewParam не передает требуемый параметр, когда используется новое пространство имен xmlns.jcp.org

Я пытаюсь использовать Glassfish 4.0 с пространствами имен Java EE 7 XML, чтобы протестировать образец ниже.

<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:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Title</title>
    </h:head>
    <h:body>
        <h:form>
             <ul>
                 <ui:repeat value="#{appLoad.movieList}" var="movie">
                    <li>
                        <h:link value="#{movie.title}" outcome="movie" includeViewParams="true">
                            <f:param name="id" value="#{movie.id}"/>
                        </h:link>
                    </li>
                </ui:repeat>
            </ul>
        </h:form>
    </h:body>
</html>

Он ссылается на следующую страницу movie.xhtml:

<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:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <f:metadata>
            <f:viewParam name="id" value="#{appLoad.movieId}"/>
            <f:event listener="#{appLoad.movieDetail()}" type="preRenderView"/>
        </f:metadata>
    </h:head>
    <h:body>
        <h:form>
            <h:panelGrid columns="2">
                <h:panelGrid columns="1" width="400">
                    <h:panelGrid columns="1">
                        Title : <h:outputLabel value="#{appLoad.movie.title}"/>
                    </h:panelGrid>  
                </h:panelGrid> 
            </h:panelGrid>  
        </h:form>
    </h:body>
</html>

Поддержка #{appLoad} bean

@ManagedBean
@RequestScoped
public class AppLoad {

    @EJB
    private MovieFacade movieFacade;
    private Movie movie = new Movie();
    private List<Movie> movieList;
    private int movieId;

    @PostConstruct
    public void movieDetail(){
        movieList = movieFacade.findAll();
        movie = movieFacade.find(movieId);
        System.out.println(movieId);
    }

    // Getters+setters.        
}

Когда страница индекса запущена и ссылка была нажата, URL-адрес полностью изменился на

result.xhtml? ID = 8

Но данные не отображаются. Он приходит как пустой. Я понял, что #{appLoad.movieId} - null. Другими словами, <f:viewParam> не устанавливает этот параметр запроса.

Единственная работа вокруг меня заключалась в том, чтобы изменить пространства имен XML на более раннюю версию.

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

Я предполагаю, что здесь что-то не так. Как возникла эта проблема и как я должен использовать новые пространства имен XML?

Ответ 1

Способ, которым обрабатываются новые пространства имен xmlns.jcp.org XML, нарушен в первых выпусках Mojarra 2.2.0 и 2.2.1. Он зафиксирован в Mojarra 2.2.2 (примечание: билет в ссылке описывает различный проблемный симптом, но под обложками он по существу тот же причина). Он рекомендовал перейти на Mojarra 2.2.2. GlassFish 4.0 содержит Mojarra 2.2.0. Вы можете получить JAR из javaserverfaces.java.net. Все, что вам нужно сделать, это заменить файл javax.faces.jar в папку GlassFish /modules на более новую версию.

Подобные проблемы, кстати, не являются необычными с самой первой крупной версией GlassFish (все хотят, чтобы она была готова вовремя). Я рекомендую подождать с Java EE 7 до тех пор, пока не выпустятся GlassFish 4.0.1 или 4.1, чтобы избежать будущих сюрпризов. Обратите внимание, что другие производители, такие как Apache Tomcat и JBoss AS, не спешат выпускать стабильный контейнер Java EE 7; в настоящее время у них нет готовой версии для производства.

См. также: