動作するためにuserIdが必要なページがいくつかあるため、次のコードがあります。
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(){
    }
}
ただし、doActionが呼び出されると、URLのビューパラメータは表示されなくなります。Beanは、そのビュースコープの性質のために引き続き機能しますが、将来のナビゲーションの試みを台無しにします。検索すると、投稿後にviewパラメーターを残して、userpage.jsf?userId = 123と表示されているように見えますが、そうではありません。本当に意図された振る舞いは何ですか?
これに関連して、userIdを保持したい別のページに移動するときに、ビューパラメータの自動追加を実装しようとしました。他の人にとってはうまくいくようですが、私にとっては、ViewRootのuserIdは常にnullです。以下のコードは、viewparameterを取得するために使用されます(一時的に保存されたuserIdをナビゲーションに使用できることはわかっていますが、このソリューションの方がはるかに優れています)。
    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.
最後に考えたのは、setterメソッドはまだ機能しているようで、postでsetUserIdが正しい値で呼び出されるということです。
ビューパラメータがどのように機能するかを完全に誤解しましたか、それともここに何らかのバグがありますか?私のユースケースは非常に一般的であり、フレームワークで基本的なサポートが必要だと思います。