微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Java中使用JMustache实现lambda函数

如何解决在Java中使用JMustache实现lambda函数

我正在关注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>

有人可以帮我弄清楚为什么该方法执行不正确吗?我已经尝试调试了一段时间了,奇怪的是,写入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");
  }

}

因此,我们必须创建一个实现Lambda并覆盖execute方法的类。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。