Wartość viewParam nie jest ustawiona w komponencie bean ViewScoped

Przepraszam, prawdopodobnie kolejne bardzo podstawowe pytanie. W moim komponencie bean ViewScoped 'viewParam' wygląda tak, jakby się ustawiał, ale kiedy zaczynam go używać, wartość ma wartość NULL. Umieszczam punkt przerwania w selektorze (setEventId ()) i pobiera wartość, ale w metodzie określonej przez mój preRenderView, nie ma go, więc nie mogę załadować obiektu Event, który próbuję pobrać.

To działało dobrze, gdy mój komponent bean był RequestScoped, ale odkryłem, że podczas testu POST i późniejszego błędu sprawdzania poprawności wszystkie moje dane zostały utracone i przeczytałem, że ViewScoped był sposobem na obejście tego problemu.

Dokonałem aktualizacji do Mojarry 2.1.7, ponieważ myślałem, że może to być błąd, a w JIRA jest rzeczywiście „krytyczny błąd”, poprawiony w 2.1.7, ale zweryfikowałem w dziennikach Glassfish, że używa nowszego wersja, a ja wciąż mam ten sam problem:http://java.net/jira/browse/JAVASERVERFACES-2266

Proszę o pomoc, oto moja fasola (próbowałem z adnotacją „ManagedProperty” i bez niej)

@ViewScoped
@Named
public class EventController extends AbstractController {

    private static final Logger logger = Logger.getLogger("EventController");

    /**
     * Request param managed property
     */
    @ManagedProperty(value="#{param.eventId}")
    private Long eventId;                

    private Event event = new Event();

    /**
     * The event dao
     */
    @Inject
    private EventDao eventDao;    

    /**
     * Load the event (requires eventId has a value)
     * @return 
     */
    public void loadEvent() {
        event = eventDao.find(eventId);
    }    

    /**
     * @return the eventId
     */
    public Long getEventId() {
        return eventId;
    }

    /**
     * @param eventId the eventId to set
     */
    public void setEventId(Long eventId) {
        this.eventId = eventId;
    }   
}

Oto, jak konstruuję link na stronie 'listEvents'

<h:link value="Full details" outcome="/calendar/viewEvent" includeViewParams="true">
<f:param name="eventId" value="#{calendarController.event.eventId}" />
</h:link>

A oto strona, która potrzebuje właściwości eventId

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core">

    <body>

        <ui:composition template="/WEB-INF/templates/standardTemplate.xhtml">

    <f:metadata>
        <f:viewParam name="eventId" value="#{eventController.eventId}"/>
        <f:event type="preRenderView" listener="#{eventController.loadEvent}" />
    </f:metadata>            

            <ui:define name="content">      

                <h1>Event details for: #{eventController.event.title}</h1>
                <h:form>
                    <p:messages/>                                               

                    <p:panelGrid style="margin-top:20px">  
                        <f:facet name="header">  
                            <p:row>  
                                <p:column colspan="4">Event details</p:column>  
                            </p:row>  
                        </f:facet>  

                        <p:row>  
                            <p:column>
                                Title
                            </p:column>  
                            <p:column colspan="3">
                                <p:inputText value="#{eventController.event.title}" size="49"/>
                                <h:inputHidden id="eventId" value="#{eventController.event.eventId}"/>
                            </p:column>   
                        </p:row>                                                                                                   
                </h:form>                                
            </ui:define>
        </ui:composition>            
    </body>
</html>

questionAnswers(2)

yourAnswerToTheQuestion