我正在开发一个Play Framework / Angular项目,我的Play Framework服务器是一个REST服务,仅供API用于在数据库中获取/发送/管理JSON,我的Angular用于客户端。
我试图让它们独立,以便能够将它们放在不同的机器上。
我的问题是路由:Play Framework尝试执行所有路由,如果某些内容不匹配则抛出错误但我希望在没有其他任何匹配时使用Angular路由(当模板,/ api时,静态文件不匹配)
在堆栈溢出时,我找到了这个帖子:play framework route that matches all 这个人和我遇到了完全相同的问题,但使用的是Java 解决方案是在文件末尾有一个匹配任何其他内容的路由:
GET /*path controllers.Application.matchAll(path)
我的问题来自于为控制器提供的代码是Java:
public class Application extends Controller {
public static Result matchAll(String path) {
return ok(Application.class.getResourceAsStream("/public/index.html")).as("text/html");
}
}
这是我在Scala的尝试:
object Application extends Controller {
def matchAll(path: String) {
val stream = Application.getClass.getClassLoader.getResourceAsStream("/public/layout.html")
Ok(stream).as("text/html");
}
}
所以在编译时我得到了错误:
"Cannot write an instance of java.io.InputStream to HTTP Response"
我在网络上找到了其他解决方案,但它们涉及使用PlayFramework路由索引......这使得它们不那么独立,所以我认为这是" Java解决方案"仍然是最好/最快的方法,我无法弄清楚Scala的等价物。
感谢您的阅读,希望这篇文章对其他人有所帮助
答案 0 :(得分:1)
尝试使用Source:
Ok(Source.fromInputStream(stream).mkString("")).as("text/html")
答案 1 :(得分:0)
@Salem有一个很好的答案(here)来解决我的编译问题。之后我只需做一些改动就可以了。这是完整的代码!
package controllers
import play.api.mvc._
import scala.io.Source
class FrontEndController extends Controller {
def matchAll(path: String) = Action {
val stream = FrontEndController.getClass.getClassLoader.getResourceAsStream("/public/layout.html")
Ok(Source.fromInputStream(stream).mkString("")).as("text/html")
}
}
object FrontEndController {}
我更改了控制器的名称"应用程序" to" FrontEndController"因为它是在任何API和静态文件已经过测试时将被调用的控制器,希望它不会让任何人感到困惑。
随意指出任何糟糕的Scala做法!我刚刚开始:)