【发布时间】:2024-01-10 10:40:01
【问题描述】:
我使用 Apache Velocity 替换模板中的标记,如下所示:
<batch>
#set( $appName = "helloworld" )
#set( $appDisplayName = "Hello World App")
#set( $appVersion = "1.0")
<registerapplication>
<appkey>$appkey</appkey>
<appname>$appName</appname>
<appversion>$appVersion</appversion>
<appdescriptiondefault>$appDisplayName</appdescriptiondefault>
</registerapplication>
</batch>
以下三行代码可以解决问题:
Velocity.init();
StringWriter w = new StringWriter();
Velocity.evaluate(new VelocityContext(), w, "", new InputStreamReader(inputStream);
效果很好,但我还有一个额外的要求。如果确实进行了某些替换,则用户应该收到通知。否则,即如果模板看起来像
<batch>
#set( $appName = "helloworld" )
#set( $appDisplayName = "Hello World App")
#set( $appVersion = "1.0")
<registerapplication>
<appkey>$appkey</appkey>
<appname>helloworld</appname>
<appdescriptiondefault>Hello World App</appdescriptiondefault>
</registerapplication>
</batch>
不应采取任何行动。
知道如何实现吗?
更新感谢克劳德布里森。我的解决方案如下:
VelocityContext velocityContext = new VelocityContext();
EventCartridge eventCartridge = new EventCartridge();
velocityContext.attachEventCartridge(eventCartridge);
eventCartridge.addReferenceInsertionEventHandler(new ReferenceInsertionEventHandler()
{
@Override
public Object referenceInsert(String reference, Object value)
{
if (!varSubsituted && value != null)
{
varSubsituted = true;
}
return value;
}
});
【问题讨论】: