Gestion des paramètres de vue dans JSF après la publication

J'ai quelques pages qui a besoin d'un code d'utilisateur pour le travail, donc le code suivant:

userpage.xhtml

<!-- xmlns etc. omitted -->
<html>
<f:metadata>
    <f:viewParam name="userId" value="#{userPageController.userId}"/>
</f:metadata>
<f:view contentType="text/html">
<h:head>
</h:head>
<h:body>
    <h:form>
        <h:commandButton action="#{userPageController.doAction}" value="post"/>
    </h:form>
</h:body>
</f:view>

userPageController.java

@Named
@ViewScoped
public class userPageControllerimplements Serializable {
    private static final long serialVersionUID = 1L;

    @Inject protected SessionController sessionController;
    @Inject private SecurityContext securityContext;
    @Inject protected UserDAO userDAO;

    protected User user;
    protected Long userId;

    public UserPage() {
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        if(!FacesContext.getCurrentInstance().isPostback()){
            User u = userDAO.find(userId);
            this.userId = userId;
            this.user = u;
        }
    }

    public void doAction(){

    }

}

Cependant, après doAction est appelée, l'affichage de paramètre dans l'url disparaît. Le haricot fonctionne toujours en raison de sa viewscoped la nature, mais il ruine mes tentatives de l'avenir de la navigation. Quand j'ai chercher partout, j'ai l'impression que le paramètre affichage doit rester après un post lire ainsi userpage.jsf?userId=123, mais ce n'est pas le cas. Qu'est-ce que vraiment l'intention de comportement?

À ce propos, j'ai essayé de mettre en œuvre ajout automatique des paramètres d'affichage lors de la navigation vers une autre page où je veux garder le nom d'utilisateur. Il semble fonctionner pour les autres, mais pour moi, le nom d'utilisateur dans le ViewRoot est toujours null. Le Code ci-dessous permet de récupérer le viewparameter (je sais que je pourrais utiliser mon stockés temporairement userId de la fève à la navigation, mais cette solution serait beaucoup plus fantaisistes):

    String name = "userId";
    FacesContext ctx = FacesContext.getCurrentInstance();
    ViewDeclarationLanguage vdl = ctx.getApplication().getViewHandler().getViewDeclarationLanguage(ctx, viewId);
    ViewMetadata viewMetadata = vdl.getViewMetadata(ctx, viewId);
    UIViewRoot viewRoot = viewMetadata.createMetadataView(ctx);
    UIComponent metadataFacet = viewRoot.getFacet(UIViewRoot.METADATA_FACET_NAME);

    //Looking for a view parameter with the specified name
    UIViewParameter viewParam = null;
    for (UIComponent child : metadataFacet.getChildren()) {
        if (child instanceof UIViewParameter) {
            UIViewParameter tempViewParam = (UIViewParameter) child;
            if (name.equals(tempViewParam.getName())) {
                viewParam = tempViewParam;
                break;
            }
        }
    }

    if (viewParam == null) {
        throw new FacesException("Unknown parameter: '" + name + "' for view: " + viewId);
    }

    //Getting the value
    String value = viewParam.getStringValue(ctx);  //This seems to ALWAYS be null.

Une dernière pensée est que le setter toujours l'air de fonctionner, setUserId est appelée avec la valeur correcte sur le post.

Ai-je complètement missunderstood comment afficher les paramètres de travail, ou est-il une sorte de bug ici? Je pense que mon cas d'utilisation doit être extrêmement commun et ont un soutien de base dans le cadre.

source d'informationauteur Rasmus Franke