【问题标题】:how to load assets,such as .css, .js file, in finatra?如何在finatra中加载资产,如.css、.js文件?
【发布时间】:2017-12-07 05:04:37
【问题描述】:

我尝试通过finatra返回一个html文件,文件本身加载成功但所有资产都不能,包含css、ico和js。浏览器响应 404:无法加载资源。
在页面底部找到文档:
-com.twitter.finatra.config.assetPath='/public': path to assets

我将公用文件夹放在src/main/resources/public 下,也失败了。 :-(

我的代码很简单:

class Login extends Controller {

  get("/signin") { request: Request =>
    val content = Source.fromURL(getClass.getResource("/forwardend/signin.html")).mkString
    response.created.html(content).toFuture
  }
}

【问题讨论】:

    标签: finatra


    【解决方案1】:

    “com.twitter.finatra.config.assetPath”适用于 Finatra v1.x,而不是您尝试使用的 Finatra 2.x(最新版本)。

    最新的 Finatra 用户指南详细介绍了如何提供文件:http://twitter.github.io/finatra/user-guide/files/

    如果您的文件在类路径上,Finatra 会找到它们,您可以通过类路径上的路径加载它们,例如,

    get("/file") { request: Request =>
      response.ok.file("/file123.txt")
    }
    

    如果你的文件在类路径上是“命名空间”的,例如,你把它们都放在一个目录下,“/resources”相对于基类路径,你可以让 Finatra 在那里查找它们,也可以通过设置“-doc.根”标志。这样我就可以在控制器中将文件引用为“/file123.txt”而不是“/resources/file123.txt”(因为 Finatra 知道目录/命名空间)。

    如果您正在测试并希望指向文件系统本地某处的文件,您可以将“-local.doc.root”标志设置为包含资产的目录。

    【讨论】:

    • 感谢@Christopher,我已经提交了一个新的答案以征求您的意见。
    【解决方案2】:

    我已经解决了一些困难:)
    方法是添加一个控制器来处理所有资产。代码为:

    import com.twitter.finagle.http.Request
    import com.twitter.finatra.http.Controller
    
    class Resources extends Controller {
      get("/assets/:*") { request: Request =>
        response.ok.file("/public/" + request.params("*"))
      }
    }
    

    请参考:http://twitter.github.io/finatra/user-guide/files/#file-server
    此外,我尝试使用下面的代码来更改资产路径,使其更漂亮,但失败了。所以我必须以“/public/”为前缀设置文件路径。如果有更好的选择,请指出,谢谢。

      System.setProperty("com.twitter.finatra.config.assetPath", "src/main/resources/public")
      System.setProperty("local.doc.root", "src/main/resources/public")  
    

    更新
    System.setProperty 不起作用。 @Christopher 谢谢提醒我。
    设置 Flag("doc.root",...) 或 Flag("local.doc.root",...) 的方法如下:
    1.定义一个模块

    object AssetsPathConfigModule extends TwitterModule {
      val keyFileDoc = flag("local.doc.root", "./finatra/src/main/scala/com/myfinatra/public", "The key to use.") // file path
      val keyDoc = flag("doc.root", "/com/myfinatra/public/", "class path") // class path
    
    //@Singleton
      @Provides
      def providesThirdPartyFoo: FileResolver = {
        new FileResolver("", keyDoc())
    //  or new FileResolver(keyFileDoc(),"")
      }
    }
    

    2.将模块添加到HttpServer的modules seq中

    class HelloWorldServer extends HttpServer {
      override val modules = Seq(
        ...,
        AssetsPathConfigModule
      )
      ...
    }
    
    1. 资源可以写成

      类资源扩展控制器 { get("/assets/:") { 请求:请求 => response.ok.file(request.params("")) } }

    【讨论】:

      【解决方案3】:

      这些指南让我有点困惑。当您想更改设置但我想知道如何通过示例使用默认设置时,它们非常有用。

      假设您的文件存储在:'/src/main/resources/public/hello.jpg'

      您可以使用以下文件直接加载它

      getClass.getClassLoader.getResource("samplecards/bcbs_anonymous.jpg").getPath 可用于返回资源的路径。您可以在 scala 中通过常规 fileIO 相应地使用此信息或此代码段。

      如果您希望做出 finatra 响应,您可以在示例案例中使用以下内容:

      get(GetImage) {
        request: ImageRequest => {
          response.ok.file(s"/public/hello.jpg")
        }
      }
      

      该文件需要一个字符串,并且似乎默认该字符串相对于项目文件夹中的{project_folder}/target/scala-x.xx/classes/,该文件夹填充了来自srcresources 文件夹的静态资产。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 2017-10-23
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        相关资源
        最近更新 更多