VelocityEngine.evaluate を呼び出した後、Velocity で無効な参照のリストを取得する方法があるかどうか疑問に思っています。
Velocity Eventhandlerには、次のように VelocityEngine で使用したAppSpecificInvalidReferenceEventHandlerの作成に関するいくつかの優れた情報があります。
<bean id="templateVelocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<props>
<prop key="resource.loader">class</prop>
<prop key="class.resource.loader.class">org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader</prop>
<prop key="class.resource.loader.cache">true</prop>
<prop key="eventhandler.invalidreferences.class">xyz.util.AppSpecificInvalidReferenceEventHandler,org.apache.velocity.app.event.implement.ReportInvalidReferences</prop>
</props>
</property>
</bean>
速度の評価呼び出しの後、AppSpecificInvalidReferenceEventHandler が機能していることを示すログ ステートメントが表示されますが、上記のように Spring コンテキストでeventhandler.invalidreferences.classを宣言すると、そのクラスと InvalidReferenceInfo のリストを取得する方法がわかりません。
テンプレートの作成と評価は次のようになります:-
VelocityContext context = new VelocityContext();
StringWriter bodyWriter = new StringWriter();
context.put("body", "some body text!");
boolean result = templateVelocityEngine.evaluate(context, bodyWriter, "logTag", "template ${body} text here loaded from a file");
だから私は次のようなことをしたいと思います(ec.getInvalidReferenceEventHandlers()がnullであることを除いて)
EventCartridge ec = context.getEventCartridge();
Iterator it = ec.getInvalidReferenceEventHandlers();
while (it.hasNext()) {
Object obj = it.next();
if (obj instanceof ReportInvalidReferences) {
AppSpecificInvalidReferenceEventHandler handler = (AppSpecificInvalidReferenceEventHandler) obj;
List invalidRefs = handler.getInvalidReferences();
if (!invalidRefs.isEmpty()) {
// process the list of invalid references here
}
}
}
これを回避する唯一の方法は、Spring Bean でeventhandler.invalidreferences.classを宣言しないことです。つまり、代わりに次のようにします。
ReportInvalidReferences reporter = new AppSpecificInvalidReferenceEventHandler();
EventCartridge ec = new EventCartridge();
ec.addEventHandler(reporter);
ec.attachToContext(context);
VelocityContext context = new VelocityContext();
StringWriter bodyWriter = new StringWriter();
context.put("body", "some body text!");
boolean result = templateVelocityEngine.evaluate(context, bodyWriter, "logTag", "template ${body} text here loaded from a file");
上記の事前の Velocity 評価セットアップ コードを追加して (Spring Bean のeventhandler.invalidreferences.classにコメントを付けて)、次に呼び出すことができます。
ec.getInvalidReferenceEventHandlers();
そして、返された Iterator で AppSpecificInvalidReferenceEventHandler を返します...