JEXL 式で使用できる JEXL エンジンにいくつかの関数を追加しました。
Map<String, Object> functions = new HashMap<String, Object>();
mFunctions = new ConstraintFunctions();
functions.put(null, mFunctions);
mEngine.setFunctions(functions);
ただし、一部の関数は例外をスローできます。次に例を示します。
public String chosen(String questionId) throws NoAnswerException {
Question<?> question = mQuestionMap.get(questionId);
SingleSelectAnswer<?> answer = (SingleSelectAnswer<?>) question.getAnswer();
if (answer == null) {
throw new NoAnswerException(question);
}
return answer.getValue().getId();
}
カスタム関数は、式を解釈するときに呼び出されます。もちろん、式はこの関数への呼び出しを保持します。
String expression = "chosen('qID')";
Expression jexl = mEngine.createExpression(expression);
String questionId = (String) mExpression.evaluate(mJexlContext);
残念ながら、この関数が解釈の過程で呼び出されたときに、 がスローされたNoAnswerException
場合、インタープリターはそれを私に伝達せず、一般的な をスローしJEXLException
ます。カスタム関数から例外をキャッチする方法はありますか? これには、プロジェクトでライブラリ jar として使用されるapache commons JEXLエンジンを使用します。