如何在 finatra 中加载资源,例如 .css、.js 文件?
how to load assets,such as .css, .js file, in finatra?
我尝试 return finatra 的 html 文件,文件本身加载成功但所有资产都不能,包含 css、ico 和 js。浏览器响应 404:can 未加载资源。
在页面底部找到文档:
-com.twitter.finatra.config.assetPath='/public': path to assets
我把 public 文件夹放在 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
}
}
我好不容易解决了:)
方法是添加一个控制器来处理所有资产。代码为:
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.add 模块到 HttpServer 的模块 seq
class HelloWorldServer extends HttpServer {
override val modules = Seq(
...,
AssetsPathConfigModule
)
...
}
资源可以写成
class资源扩展控制器{
get("/assets/:") { 请求:请求 =>
response.ok.file(request.params(""))
}
}
"com.twitter.finatra.config.assetPath" 适用于 Finatra v1.x 而不是 Finatra 2.x(最新版本),您似乎正在尝试使用它。
最新的 Finatra user-guide 详细介绍了如何提供文件:http://twitter.github.io/finatra/user-guide/files/。
如果您的文件在类路径中,Finatra 会找到它们,您可以通过类路径中的路径加载它们,例如,
get("/file") { request: Request =>
response.ok.file("/file123.txt")
}
如果您的文件 "namespaced" 在类路径上,例如,您将它们全部放在一个目录下,相对于基类路径的“/resources”,您可以让 Finatra 在那里查找它们,方法是设置“-doc.root”标志。在我看来,您可以在控制器中将该文件引用为“/file123.txt”而不是“/resources/file123.txt”(因为 Finatra 知道 directory/namespace)。
如果您正在测试并希望指向文件系统本地某处的文件,您可以将“-local.doc.root”标志设置为包含资产的目录。
指南让我有点困惑。当您想更改设置时它们非常有用,但我想知道如何使用示例使用默认设置。
假设您的文件存储在:'/src/main/resources/public/hello.jpg'
您可以通过以下方式使用 fileIO 直接加载它
getClass.getClassLoader.getResource("samplecards/bcbs_anonymous.jpg").getPath
可以用来return资源的路径。您可以将此信息或此代码段与 Scala 中的常规文件 IO 相应地使用。
如果您希望做出 finatra 响应,您可以使用以下示例案例:
get(GetImage) {
request: ImageRequest => {
response.ok.file(s"/public/hello.jpg")
}
}
该文件需要一个字符串,并且似乎默认该字符串相对于项目文件夹中的 {project_folder}/target/scala-x.xx/classes/
,该文件夹中填充了 src
中 resources
文件夹中的静态资产。
我尝试 return finatra 的 html 文件,文件本身加载成功但所有资产都不能,包含 css、ico 和 js。浏览器响应 404:can 未加载资源。
在页面底部找到文档:
-com.twitter.finatra.config.assetPath='/public': path to assets
我把 public 文件夹放在 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
}
}
我好不容易解决了:)
方法是添加一个控制器来处理所有资产。代码为:
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.add 模块到 HttpServer 的模块 seq
class HelloWorldServer extends HttpServer {
override val modules = Seq(
...,
AssetsPathConfigModule
)
...
}
资源可以写成
class资源扩展控制器{ get("/assets/:") { 请求:请求 => response.ok.file(request.params("")) } }
"com.twitter.finatra.config.assetPath" 适用于 Finatra v1.x 而不是 Finatra 2.x(最新版本),您似乎正在尝试使用它。
最新的 Finatra user-guide 详细介绍了如何提供文件:http://twitter.github.io/finatra/user-guide/files/。
如果您的文件在类路径中,Finatra 会找到它们,您可以通过类路径中的路径加载它们,例如,
get("/file") { request: Request =>
response.ok.file("/file123.txt")
}
如果您的文件 "namespaced" 在类路径上,例如,您将它们全部放在一个目录下,相对于基类路径的“/resources”,您可以让 Finatra 在那里查找它们,方法是设置“-doc.root”标志。在我看来,您可以在控制器中将该文件引用为“/file123.txt”而不是“/resources/file123.txt”(因为 Finatra 知道 directory/namespace)。
如果您正在测试并希望指向文件系统本地某处的文件,您可以将“-local.doc.root”标志设置为包含资产的目录。
指南让我有点困惑。当您想更改设置时它们非常有用,但我想知道如何使用示例使用默认设置。
假设您的文件存储在:'/src/main/resources/public/hello.jpg'
您可以通过以下方式使用 fileIO 直接加载它
getClass.getClassLoader.getResource("samplecards/bcbs_anonymous.jpg").getPath
可以用来return资源的路径。您可以将此信息或此代码段与 Scala 中的常规文件 IO 相应地使用。
如果您希望做出 finatra 响应,您可以使用以下示例案例:
get(GetImage) {
request: ImageRequest => {
response.ok.file(s"/public/hello.jpg")
}
}
该文件需要一个字符串,并且似乎默认该字符串相对于项目文件夹中的 {project_folder}/target/scala-x.xx/classes/
,该文件夹中填充了 src
中 resources
文件夹中的静态资产。