Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中用JMustache实现lambda函数_Java_Javadoc_Mustache - Fatal编程技术网

在java中用JMustache实现lambda函数

在java中用JMustache实现lambda函数,java,javadoc,mustache,Java,Javadoc,Mustache,我正在遵循JMustache的文档:。它说我们可以调用java函数并在Mustache模板中使用它们。我有这样一个lambda函数 Mustache.Lambda lookupInstance = new Mustache.Lambda() { public void execute (Template.Fragment frag, Writer out) throws IOException { out.write("<b>")

我正在遵循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>");
      }
    };
模板的输出如下所示:

is awesome.
我期待着

<b> is awesome.</b>
太棒了。

有人能帮我弄清楚为什么这个方法不能正常执行吗?我已经试着调试了很长一段时间了。奇怪的是,任何写给编写器的东西都被忽略了,frag.execute是唯一有效的东西。这种方法对作者有什么作用?它被忽略了吗?frag内部是否有不同的引用要写入?

我遇到的问题是Spring RestDocs使用Mustach作为传递依赖项。我已经在
pom.xml
中添加了JMustache,这是多余的。我们可以通过以下方式使用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并重写
execute
方法的类。

您仍然可以用匿名类替换
新的MyMustacheLambda()
。您不必创建另一个类文件
@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();
    }
  }
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");
  }

}