我想通过速度生成控制器层代码。我生成一个映射方法:
@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());
}
那我该怎么办?
您可以像这样使用#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")