在 java 中使用 JMustache 实现 lambda 函数
Implementing a lambda function with JMustache in java
我正在关注 JMustache 的文档:https://github.com/samskivert/jmustache。它说我们可以调用 java 函数并在 Mustache 模板中使用它们。我有一个像这样的 lambda 函数
Mustache.Lambda lookupInstance = new Mustache.Lambda() {
public void execute (Template.Fragment frag, Writer out) throws IOException {
out.write("<b>");
frag.execute(out);
out.write("</b>");
}
};
然后我有一个像这样引用 lambda 的模板文件
{{#myMethod}} is awesome.{{/myMethod}}
模板的输出如下:
is awesome.
我在期待
<b> is awesome.</b>
谁能帮我弄清楚为什么该方法无法正确执行?很长一段时间以来,我一直在尝试调试它 now.It 奇怪的是,写入 Writer 的任何内容都被忽略了,而 frag.execute 是唯一有效的东西。该方法对 Writer 有什么作用?它被忽略了吗?是否有不同的参考写入片段内部?
我 运行 遇到的问题是 Spring RestDocs 使用 Mustache 作为传递依赖项。我已将 JMustache 添加到 pom.xml
中,这是多余的。我们可以通过以下方式使用 lambda 函数
@Override
public void document(Operation operation) throws IOException {
try {
RestDocumentationContext context = (RestDocumentationContext) operation
.getAttributes().get(RestDocumentationContext.class.getName());
StandardWriterResolver writerResolver = new StandardWriterResolver(
new RestDocumentationContextPlaceholderResolverFactory(),
"UTF-8",
new TemplateFormat() {
@Override public String getId() { return outFileExt; }
@Override public String getFileExtension() { return outFileExt; }
});
Map<String,Object> data = new HashMap<>(operation.getAttributes());
data.put("myMethod", new MyMustacheLambda());
TemplateEngine templateEngine =
(TemplateEngine) data
.get(TemplateEngine.class.getName());
try (Writer writer = writerResolver.resolve(
operation.getName(),
outFileName,
context)) {
writer.append(templateEngine
.compileTemplate(this.templateName)
.render(data));
}
}
catch (Throwable t) {
t.printStackTrace();
}
}
并通过
实现lambda函数
import java.io.IOException;
import java.io.Writer;
import org.springframework.restdocs.mustache.Mustache.Lambda;
import org.springframework.restdocs.mustache.Template.Fragment;
public class MyMustacheLambda implements Lambda {
@Override
public void execute(Fragment fragment, Writer writer) throws IOException {
String output = fragment.execute();
writer.write("test");
}
}
所以我们必须创建一个 class 来实现 Lambda 并覆盖 execute
方法。
我正在关注 JMustache 的文档:https://github.com/samskivert/jmustache。它说我们可以调用 java 函数并在 Mustache 模板中使用它们。我有一个像这样的 lambda 函数
Mustache.Lambda lookupInstance = new Mustache.Lambda() {
public void execute (Template.Fragment frag, Writer out) throws IOException {
out.write("<b>");
frag.execute(out);
out.write("</b>");
}
};
然后我有一个像这样引用 lambda 的模板文件
{{#myMethod}} is awesome.{{/myMethod}}
模板的输出如下:
is awesome.
我在期待
<b> is awesome.</b>
谁能帮我弄清楚为什么该方法无法正确执行?很长一段时间以来,我一直在尝试调试它 now.It 奇怪的是,写入 Writer 的任何内容都被忽略了,而 frag.execute 是唯一有效的东西。该方法对 Writer 有什么作用?它被忽略了吗?是否有不同的参考写入片段内部?
我 运行 遇到的问题是 Spring RestDocs 使用 Mustache 作为传递依赖项。我已将 JMustache 添加到 pom.xml
中,这是多余的。我们可以通过以下方式使用 lambda 函数
@Override
public void document(Operation operation) throws IOException {
try {
RestDocumentationContext context = (RestDocumentationContext) operation
.getAttributes().get(RestDocumentationContext.class.getName());
StandardWriterResolver writerResolver = new StandardWriterResolver(
new RestDocumentationContextPlaceholderResolverFactory(),
"UTF-8",
new TemplateFormat() {
@Override public String getId() { return outFileExt; }
@Override public String getFileExtension() { return outFileExt; }
});
Map<String,Object> data = new HashMap<>(operation.getAttributes());
data.put("myMethod", new MyMustacheLambda());
TemplateEngine templateEngine =
(TemplateEngine) data
.get(TemplateEngine.class.getName());
try (Writer writer = writerResolver.resolve(
operation.getName(),
outFileName,
context)) {
writer.append(templateEngine
.compileTemplate(this.templateName)
.render(data));
}
}
catch (Throwable t) {
t.printStackTrace();
}
}
并通过
实现lambda函数import java.io.IOException;
import java.io.Writer;
import org.springframework.restdocs.mustache.Mustache.Lambda;
import org.springframework.restdocs.mustache.Template.Fragment;
public class MyMustacheLambda implements Lambda {
@Override
public void execute(Fragment fragment, Writer writer) throws IOException {
String output = fragment.execute();
writer.write("test");
}
}
所以我们必须创建一个 class 来实现 Lambda 并覆盖 execute
方法。