首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在finatra中加载资产(如.css、.js文件)?

如何在finatra中加载资产(如.css、.js文件)?
EN

Stack Overflow用户
提问于 2016-01-23 04:04:18
回答 3查看 767关注 0票数 1

我尝试通过finatra返回一个html文件,文件本身加载成功,但是所有的资产都不能,包含css、ico和js。浏览器响应404:无法加载资源。

在页面底部找到文档:

-com.twitter.finatra.config.assetPath='/public':资产路径

我把公用文件夹放在src/主要/资源/公众下,也失败了。:-(

我的代码简单如下:

代码语言:javascript
复制
class Login extends Controller {

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-23 15:04:39

我用一些挣扎来解决这个问题:)

方法是添加一个控制器来处理所有资产。守则如下:

代码语言:javascript
复制
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/“作为前缀设置文件路径。如果有更好的选择,请指出,谢谢。

代码语言:javascript
复制
  System.setProperty("com.twitter.finatra.config.assetPath", "src/main/resources/public")
  System.setProperty("local.doc.root", "src/main/resources/public")  

更新

System.setProperty不工作。@克里斯托弗谢谢提醒我。

设置国旗的一种方法(“doc.root”,.)或国旗(“local.doc.root”,.)现如下:

  1. 定义模块
代码语言:javascript
复制
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的模块seq

代码语言:javascript
复制
class HelloWorldServer extends HttpServer {
  override val modules = Seq(
    ...,
    AssetsPathConfigModule
  )
  ...
}
  1. 资源可以写为asclass Resources extends { get("/assets/:") { request: Request => response.ok.file(request.params("")) }}
票数 0
EN

Stack Overflow用户

发布于 2016-01-23 16:49:30

"com.twitter.finatra.config.assetPath“用于Finatra v1.x,而不是Finatra 2.x (最新版本),看起来您正在尝试使用它。

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

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

代码语言:javascript
复制
get("/file") { request: Request =>
  response.ok.file("/file123.txt")
}

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-12-06 21:04:37

导游让我有点困惑。当您想要更改设置时,它们非常有用,但我想知道如何使用一个示例来处理默认设置。

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

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

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

如果您希望做出最后的响应,可以使用下面的示例案例:

代码语言:javascript
复制
get(GetImage) {
  request: ImageRequest => {
    response.ok.file(s"/public/hello.jpg")
  }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34959482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档