JSFのviewParamで値が設定されない
寺田さんの話などを聞いてJava EEに興味を持ち,最近になってEEを触り始めています.
JSFのviewParamにおいて管理対象Beanのセッターが呼ばれず値が設定されないことがあったので解決方法を書いておきます.
環境はGlassFish 4.0(b89), Mojarra 2.2.0(JSF)です.
JSFでURLクエリパラメータを利用するためにはviewParamを使います.
URLクエリパラメータやviewParamについてはJSF 2.0 : ブックマーク可能な URL (GET リクエスト) のサポートと動的パラメータ設定 | 寺田 佳央 - Yoshio Teradaを参考にしました.
index.xhtml
<?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:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"> <f:metadata> <f:viewParam id="param" name="param" value="#{backingBean.param}"/> </f:metadata> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:form> <h:outputLabel value="#{backingBean.param}"/> </h:form> </h:body> </html>
対応する管理対象Beanは以下のような感じです.
@ManagedBean @Dependent public class BackingBean { private String param; public BackingBean() { } public String getParam() { return param; } public void setParam(String param) { this.param = param; } }
こうするとクエリパラメータ付きでアクセスがあった際にbackingBean#setParamが呼ばれて値が設定されるはずです.
そして,h:outputLabelによってbackingBean#getParamが呼ばれクエリパラメータの値が画面に出力されるはずです.
ですが,「http://・・・/index.xhtml?param=aaa」などとしてアクセスしても画面は真っ白なままです.
backingBean#setParamが呼ばれていないためです.
この問題はhttps://java.net/jira/browse/JAVASERVERFACES-2868で報告され,修正されています.
Mojarraのバージョンを上げる事で修正させることができます.
Mojarraのバージョンを上げる事ができない場合は,古い名前空間を使用することで正常に動作させることができます.
この問題が新しいtaglib名前空間を使用することで発生するバグのためです.
jsf - f:param and f:viewparam setter not called - Stack Overflow
古い名前空間を使用する様に変更することでセッターが呼ばれて正常に動作します.
<?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:h="http://xmlns.jcp.org/jsf/html" xmlns:oldf="http://java.sun.com/jsf/core"> <oldf:metadata> <oldf:viewParam id="param" name="param" value="#{backingBean.param}"/> </oldf:metadata> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:form> <h:outputLabel value="#{backingBean.param}"/> </h:form> </h:body> </html>