速度实现嵌套变量分辨率

问题描述 投票:0回答:1

我想通过速度生成控制器层代码。我生成一个映射方法:

@ResponseBody
@PostMapping(value = "\\${peacetrue.${moduleName}.urls.add}")
public ${ModuleName}VO add(${ModuleName}Add params) {
    logger.info("add record[{}]", params);
    return ${moduleName}Service.add(params);
}

然后我得到了例外:

{DomainName}Controller.java.vm[line 18, column 39]
Was expecting one of:
    "[" ...
    "|" ...
    "}" ...
    "}" ...

然后我编写了单元测试:

    @Test
    public void translate() {
        Velocity.init();

        Map<String, Object> singletonMap = Collections.singletonMap("foo", "bar");
        StringWriter stringWriter = new StringWriter();
        Velocity.evaluate(new VelocityContext(singletonMap), stringWriter, "log", "$foo");
        Assert.assertEquals("bar", stringWriter.toString());
        stringWriter = new StringWriter();
        Velocity.evaluate(new VelocityContext(singletonMap), stringWriter, "log", "\\${com.${foo}.name}");
        Assert.assertEquals("${com.bar.name}", stringWriter.toString());
    }

那我该怎么办?

velocity
1个回答
0
投票

您可以像这样使用#evaluate()指令(至少从v1.7起使用):

@PostMapping("#evaluate("\$peacetrue.${moduleName}.urls.add")")

或(对于以前的版本)如下:

@PostMapping("#set($d='$')#evaluate("${d}peacetrue.${moduleName}.urls.add")")

或者如果上下文中存在EscapeTool

@PostMapping("#evaluate("${esc.dollar}peacetrue.${moduleName}.urls.add")")

或者如果$peacetrue具有模块的标准吸气剂(例如.getFoo()get('foo')作为映射):

@PostMapping("$peacetrue.get($moduleName).urls.add")
© www.soinside.com 2019 - 2024. All rights reserved.