なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

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>
(略)

まとめ

めんどい(;´Д`)

参考