我尝试通过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
}
}
答案 0 :(得分:1)
“com.twitter.finatra.config.assetPath”适用于Finatra v1.x,而不是Finatra 2.x(最新版本),您似乎正在尝试使用它。
最新的Finatra用户指南详细介绍了如何投放文件:http://twitter.github.io/finatra/user-guide/files/。
如果你的文件在类路径上,Finatra会找到它们,你可以通过类路径上的路径加载它们,例如,
dataFile = open(dFile, mode='r+b') # failed with windows access error
dataFile = open(dFile, 'r+b') # works
如果您的文件在类路径上是“命名空间”,例如,您将它们全部放在目录下,相对于基类路径的“/ resources”,您可以通过设置“-doc”让Finatra在那里查找它们。根“旗帜。这样我就可以在控制器中将文件引用为“/file123.txt”而不是“/resources/file123.txt”(因为Finatra知道目录/命名空间)。
如果您正在测试并希望指向文件系统本地的文件,则可以将“-local.doc.root”标志设置为包含资产的目录。
答案 1 :(得分:0)
我已经解决了一些问题:) 方法是添加一个控制器来处理所有资产。代码为:
NULL
参考:http://twitter.github.io/finatra/user-guide/files/#file-server
此外,我尝试使用下面的代码来更改资产路径,使其更漂亮,但失败了。所以我必须用“/ public /”作为前缀设置文件路径。如果它有更好的选择,请指出,谢谢。
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("*"))
}
}
<强>更新强>
System.setProperty不起作用。 @Christopher感谢提醒我。
设置Flag(“doc.root”,...)或Flag(“local.doc.root”,...)的方法如下:
1.定义一个模块
System.setProperty("com.twitter.finatra.config.assetPath", "src/main/resources/public")
System.setProperty("local.doc.root", "src/main/resources/public")
2.将模块添加到HttpServer的模块seq
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(),"")
}
}
资源可以写为
类资源扩展Controller { get(“/ assets /:”){request:Request =&gt; response.ok.file(request.params( “”)) } }
答案 2 :(得分:0)
指南对我来说有点混乱。当您想要更改设置时它们非常有用,但我想知道如何使用示例使用默认设置。
假设您的文件存储在:'/ src / main / resources / public / hello.jpg'
您可以使用带有以下
的fileIO直接加载它 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/
的字符串,该文件夹中填充了resources
中src
文件夹中的静态资源。