2008年12月26日金曜日

OGNL式に"or"を含むパッケージ名を持つclass名を記述した場合に解析エラーになる

package com.shin1o;

public class OkUtil {
  public static String staticMethod() { return "OK!"; }
}
package jp.or.hoge;

public class NgUtil {
  public static String staticMethod() { return "NG!"; }
}
import static org.junit.Assert.*;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class OgnlTest {

  private OgnlContext ognlContext;

  @Before public void setUp() {
    ognlContext = new OgnlContext();
  }

  @After public void tearDown() {
    ognlContext.clear();
    ognlContext = null;
  }

  @Test public void staticMethod() throws OgnlException {
    assertEquals("OK!", com.shin1o.OkUtil.staticMethod());
    assertEquals("NG!", jp.or.hoge.NgUtil.staticMethod());
  }

  @Test public void okStaticMethod() throws OgnlException {
    assertEquals("OK!", Ognl.getValue(Ognl.parseExpression("@com.shin1o.OkUtil@staticMethod()"), ognlContext));
  }

  @Test public void ngStaticMethod() throws OgnlException {
    // FQCNに"or"を含んだclassのstaticメソッドを実行する式が解析エラーになる…。
    assertEquals("NG!", Ognl.getValue(Ognl.parseExpression("@jp.or.hoge.NgUtil@staticMethod()"), ognlContext));
  }
}
ognl.ExpressionSyntaxException: Malformed OGNL expression: @jp.or.hoge.NgUtil@staticMethod()
[ognl.ParseException: Encountered " "or" "or "" at line 1, column 5.
Was expecting:
     ...
    ]
    at ognl.Ognl.parseExpression(Ognl.java:112)
    at com.shin1o.OgnlTest.ngStaticMethod(OgnlTest.java:43)
...
FQCNに"or"を含んだclassのstaticメソッドを実行する式が解析エラーになってしまい、ngStaticMethod()が通らない。「jp.or.hoge.NgUtil」の「or」の部分を意味のある単語だと読み違えてしまっているらしぃ。"jp.or.hoge"はFQCNだよー"or"はその一部だよー、と伝えてあげる方法がワカラナイ!どなたか知っている方、教えて下さい!!うまいキーワードが見つからず、ぐぐっても解決に辿り着けなかったのです。

コメントを投稿