【问题标题】:Check if tokens have been substituted检查令牌是否已被替换
【发布时间】: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;
    }
});

【问题讨论】:

    标签: java token velocity


    【解决方案1】:

    您可以使用引用插入处理程序。

    首先,创建您的处理程序类:

    package mypackage;
    import org.apache.velocity.app.event.ReferenceInsertionEventHandler;
    
    public class MyHandler implements ReferenceInsertionEventHandler
    {
        public Object referenceInsert( String reference, Object value  )
        {
            // ...notify user...
        }
    }
    

    然后您可以在 velocity.properties 文件中注册您的处理程序,其中:

    eventhandler.referenceinsertion.class = mypackage.UserNotifyHandler
    

    在多线程应用程序中,由于 Velocity 是单线程的,因此您可以使用全局线程特定变量来保存所涉及的用户信息,因为您需要在处理程序中使用它。

    【讨论】: