myBatisを使ってマッパーファイルを作成していると、OGNLで条件式を記載しなければならないが記載に癖があってサクッと作成した条件式が期待通り動作するかを確認したい時がある。
なので、以下にローカル環境でOGNL条件式を使用したプログラムを記載する。
準備
gradleプロジェクトを作成
$ mkdir testOgnl #任意のディレクトリ名
$ cd testOgnl
$ gradle init #gradleプロジェクト作成
gradleプロジェク作成内容
Select type of build to generate:
1: Application
2: Library
3: Gradle plugin
4: Basic (build structure only)
Enter selection (default: Application) [1..4] 1を選択
Select implementation language:
1: Java
2: Kotlin
3: Groovy
4: Scala
5: C++
6: Swift
Enter selection (default: Java) [1..6] 1を選択
Select application structure:
1: Single application project
2: Application and library project
Enter selection (default: Single application project) [1..2] 1を選択
Select build script DSL:
1: Kotlin
2: Groovy
Enter selection (default: Kotlin) [1..2] 2を選択
その他はデフォルトでOK
以下を追加
build.gradle
dependencies {
implementation 'ognl:ognl:3.3.4'
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
//他はデフォルトでOK
}
テスト用のプログラムを作成
OgnlTester.java
package org.example;
// OGNLライブラリのクラスをインポート
import ognl.Ognl;
import ognl.OgnlContext;
import java.util.HashMap;
import java.util.Map;
import java.math.BigDecimal;
/**
* OGNL式を使って条件評価を行うサンプルクラスです。
* Mapに格納したパラメータを使って、OGNL式の評価結果を取得し表示します。
*/
public class OgnlTester {
public static void main(String[] args) throws Exception {
// 評価対象のパラメータを格納するMapを作成
Map<String, Object> params = new HashMap<>();
// valueにbicdecimalを設定する場合は、BigDecimalをインポートして使用
params.put("value", new BigDecimal("1L")); // 例: BigDecimal値
params.put("price", Long.valueOf(1)); // 例: Long値
params.put("version", new String("1")); // バージョン
params.put("status", "ACTIVE"); // ステータス(文字列)
params.put("name", null); // 名前(null)
// 評価対象のOGNL式を文字列として定義
String expression = "version.equals(\"1\") ";
String expression2 = "price == 1L ";
// OGNL評価用のコンテキストを生成(ルートオブジェクトなし)
OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
// 式を構文解析(Expression Treeを生成)
Object tree = Ognl.parseExpression(expression);
Object tree2 = Ognl.parseExpression(expression2);
// OGNL式を評価して結果を取得(paramsの値を使って式を評価)
Object result = Ognl.getValue(tree, context, params);
Object result2 = Ognl.getValue(tree2, context, params);
// 評価結果を出力
System.out.println("評価結果: " + result);
System.out.println("評価結果2: " + result2);
}
}
gradleコマンドで実行
$ ./gradlew build
$ ./gradlew run