viewParam-Wert in ViewScoped-Bean nicht festgelegt

Tut mir leid, wahrscheinlich eine andere wirklich grundlegende Frage. In meinem ViewScoped-Bean sieht ein 'viewParam' so aus, als würde es gesetzt, aber wenn ich es verwende, ist der Wert null. Ich habe einen Haltepunkt in den Setter (setEventId ()) eingefügt und dieser erhält den Wert, aber in der von meinem preRenderView angegebenen Methode ist er weg, so dass ich das Event-Objekt, das ich abzurufen versuche, nicht laden kann.

Dies funktionierte einwandfrei, als mein Bean RequestScoped war, aber ich stellte fest, dass bei einem POST- und nachfolgenden Validierungsfehler alle meine Details verloren gingen und las, dass ViewScoped der Weg war, um dieses Problem zu umgehen.

Ich habe ein Upgrade auf Mojarra 2.1.7 durchgeführt, weil ich dachte, es könnte sich um einen Fehler handeln. In der Tat wurde in der JIRA ein "kritischer Fehler" aufgeführt, der in 2.1.7 behoben wurde. In den Glassfish-Protokollen habe ich jedoch festgestellt, dass der neuere Fehler verwendet wurde Version, und ich bekomme immer noch das gleiche Problem:http://java.net/jira/browse/JAVASERVERFACES-2266

Bitte helfen Sie, hier ist meine Bohne (ich habe es mit und ohne die Annotation 'ManagedProperty' versucht)

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

So konstruiere ich den Link auf der Seite 'listEvents'

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

Und hier ist die Seite, die die Eigenschaft eventId benötigt

<?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>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage