EL式内でEL式が使えない件
背景
JSPでEL式を書くことはよくありますが、そのEL式内でEL式を書こうとしたらエラーになったので、その対処法のメモです。
起こったこと
以下のようなコードを書いたらエラーになった(;´Д`) * 以下※はコメント
(略) <select id="userId" name="userId"> <c:forEach var="user" items="${Users}" > ※ModelにセットしてあるUserリストを回す。 ※Userの情報で要素を生成する。ModelにセットしてあるMessageSourceを使って表示名を取りたい。 <option value="${user.getId()}">${user.getDisplayname(${MessageSource}, request.getLocale())}</option> </c:forEach> </select> (略)
実行すると文法・パース系のエラー。
javax.el.ELException: Failed to parse the expression [${user.getDisplayname(${MessageSource}, request.getLocale())}] org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:142) org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:168) org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:232) (略) org.apache.el.parser.ParseException: Encountered " "{" "{ "" at line 1, column 24. Was expecting one of: "." ... ")" ... (略)
- ${user.getId()}・・・単純なメソッド呼び出しなのでOK
- request.getLocale()・・・スコープでの単純なメソッド呼び出しなのでOK
- ${user.getDisplayname(${MessageSource}, request.getLocale())・・・引数にnullを直書きして渡すとエラーがでないので、EL式の結果をEL式に渡すのはNGらしい(;´Д`)
対処方法
変数を用意して一時的にそこにEL式の結果を代入して、その変数を別のEL式に渡すらしい。
(略) <select id="userId" name="userId"> <c:forEach var="user" items="${Users}" > <c:set var="messageSource" value="${MessageSource}" /> <option value="${user.getId()}">${user.getDisplayname(messageSource, request.getLocale())}</option> </c:forEach> </select> (略)
まとめ
めんどい(;´Д`)