2017-08-13 74 views
0

我在嘗試使用Vertex的HandleBars模板引擎的模板時不斷掙扎着NoSuchFileException。 我個人認爲醚Vertx文件系統的根目錄不一致,或者我失去了一些東西,代碼片段如下:Vert.x文件根與Handlebars模板位置

String templateLocation = "templates"+File.separator+"index.hbs"; 
    fs = vertx.fileSystem(); 
    fs.exists(templateLocation, existHandler -> { 
     if(existHandler.succeeded() && existHandler.result() == true){ 
      engine.render(context,templateLocation, renderResult -> { 
       if (renderResult.succeeded()) { 
        context.request().response().putHeader("Content-Type", "text/html"); 
        context.response().end(renderResult.result()); 
       } else { 
        context.fail(renderResult.cause()); 
       } 
      }); 

杉杉,我通過存在確認,確實目錄和模板文件存在。如果是的話,他們開始呈現在同一個目錄下的動作,我掉進:

java.nio.file.NoSuchFileException: \emplates\index.hbs

事件雖然文件系統要求的目錄存在。 HandleBars希望能找到它的模板? 我已經複製/粘貼文件夾templates/index.hbs所有可能的地點:

  • 項目根
  • 的src /資源Java所在的主要執行

都沒有成功

  • 目錄..

    另外請注意丟失t的例外情況,不是錯字,看起來像是堆棧裏的東西處理得不好路徑

  • +0

    '\ emplates \ index.hbs'(缺少't')很奇怪,是一個錯字,還是堆棧中有反斜槓有問題的東西? (不熟悉Vert.x) –

    +0

    好點,最近注意到了。有東西在路上吃掉第一個字符。我在開始時添加了虛擬字符,進程繼續失敗 – Tomas

    +0

    您可以使用正斜槓代替,java [將處理它們](https://stackoverflow.com/a/19762195/6730571) –

    回答

    0

    你正在試圖做錯誤的方式。 Vertx應該爲你做的:

    TemplateEngine engine = HandlebarsTemplateEngine.create(); 
    TemplateHandler handler = TemplateHandler.create(engine); 
    
    router.get("/*").handler(handler); 
    

    http://vertx.io/docs/vertx-web/java/#_handlebars_template_engine

    ,這會使得下resources/templates

    任何模板如果您仍然希望通過自己的一些理由罵.render,你可以做到這一點:

    router.get("/").handler(ctx -> { 
        engine.render(ctx, "templates/index.hbs", res -> { 
         if (res.succeeded()) { 
          ctx.response().end(res.result()); 
         } 
        }); 
    }); 
    

    同樣,這會顯得你的模板/resources文件夾下

    +0

    不知道該告訴你什麼,但這是*絕對*不是這種情況。只有在HandlebarsTemplateEngine使用基於類路徑的加載器時纔會使用'resources',但它不是 - 它只是使用文件系統。不幸的是,由於HandlebarsTempateEngine中的加載器是硬編碼的,因此很難讓它使用除了相對於工作目錄的目錄之外的其他任何東西。令人沮喪。 – Max