我即将为一个应该在Tomcat服务器上运行的Web应用程序启动一个项目.我决定去Scala - 我工作的另一个替代方案是Groovy - 主要是为了类型安全.我现在面临着为工作选择合适工具的任务.
我需要开发的项目只能通过JSON API访问.它将与自己的数据库和两个外部服务进行交互,这两个服务分别公开JSON和XML API.我还需要能够安排定期作业,我的应用程序将使用这些外部服务执行各种同步任务.
对于数据库,我希望能够在Scala中定义我的模型并自动生成模式.如果需要更改我的模型,我希望有迁移来处理它.
对于这个应用程序,我试图评估Lift,Play!2和Scalatra.
电梯是我的第一选择.它是三个项目中最成熟的,似乎被认为是高度安全的(我不想在安全性上妥协).此外,它具有Scala中最好的JSON处理库.不过,在尝试了一下之后,我不确定这是不是正确的选择.文档并不是我见过的最好的文档.此外,Record + Squeryl在我看来比Mapper更好的抽象,但这种用途的文档更加稀缺.最后,尽管Lift当然可以用于创建Web服务,但它的真正优势似乎在于状态处理,因此我不相信我的项目需要额外的复杂性.
玩!2似乎有更好的文档,我看起来更熟悉(我来自Django背景).同样,它的默认数据库抽象并不能让我安心:ANORM依赖于SQL,这对类型检查没有帮助.无论如何我不得不使用Squeryl,我不确定这个用例的文档是否同样好.而且,部署Play!目前有2个应用程序比我想要的更复杂.一个人必须安装Play!在生产服务器上,我不确定这是我工作的选项.否则,有一个插件可以使它与servlets容器一起使用,但它是非常新的,我不确定它是多么稳定/可靠.
最后,可以选择使用Scalatra.Scalatra似乎很容易设置,它的设计完全是为了创建Web服务.折衷方案是Scalatra不提供太多功能.它不与现有ORM集成或建议如何组织应用程序的模型部分,它无助于设计cron或命令行任务.我也不确定该项目的长期未来.
您认为什么是我的任务的最佳选择?
我打算实现一个纯Akka驱动的基于REST的Web API.我不确定使用喷雾剂.如果有任何好处,我会考虑使用Scalatra.基本上我对使用Scala Actor模型的并发优势感兴趣.我不希望Servlet容器成为该过程中的障碍.
还有什么其他选择?
更新1:哪个是基于Akka后端实现REST的更好前端? - 喷雾,Scalatra或Dropwizard或任何其他?
我有一个HTML字符串,我将其复制粘贴到String对象中,如下所示:
val s = """<body>
<p>This is a test</p> <p>This is a test 2</p>
</body"""
Run Code Online (Sandbox Code Playgroud)
这里的问题是,当我在Web浏览器的上下文中将此字符串显示为JSON时,输出会显示文字\n和\t字符,如下所示:
"<body>\n <p>This is a test</p>\t <p>This is a test 2</p>\n</body>"
Run Code Online (Sandbox Code Playgroud)
是否有可能从Scala中的字符串输出中删除所有这些转义序列?
我有一个scalatra servlet:
post("/asdf") {
???
}
Run Code Online (Sandbox Code Playgroud)
我的客户在邮件正文中发送xml,因此我需要从请求中提取原始文本.我如何在scalatra中做到这一点?
我使用scalatra将MongoDB数据"导出"到JSon,我的操作非常简单,如:
get("/") {
val title = db.get_collection("main", "api", "title")
send_json(title)
}
Run Code Online (Sandbox Code Playgroud)
如果出现问题,我想发送HTTP错误和文本,另一方面,它将被转换为对用户有意义的东西.所以方法成为:
get("/") {
try {
val title = db.get_collection("main", "api", "title")
send_json(title)
} catch {
case e:java.util.NoSuchElementException => send_error("DB malformed", InternalError)
case e:com.mongodb.MongoException => send_error("Can not connect to MongoDB", InternalError)
case e => send_error("Internal Error", InternalError)
}
}
Run Code Online (Sandbox Code Playgroud)
try catch更大,实际的方法和我需要为每个方法执行此操作,该类乍一看是一个丑陋的try catch集合.有什么方法可以避免或最小化整个代码中的不良外观和分散注意力的尝试捕获?我是Scala(和Java BTW)的新手,所以我想我错过了一些东西.
我不希望DB对象发送JSON,因此在db.get_collection方法上使用try catch不是一个选项.
看起来像是一个相当直接的问题,但是当我触发Scalatra中的顶级错误处理程序时,我想记录堆栈跟踪.我故意在我的一个方法中抛出异常做一些简单的事情:
throw new IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)
在错误处理程序中,代码如下所示:
error {
case e => {
val logger = LoggerFactory.getLogger(getClass)
logger.info("an exception occurred: " + e.getStackTrace())
logger.info("the request body is: " + request)
NotFound("An error occurred, please contact support")
}
}
Run Code Online (Sandbox Code Playgroud)
错误处理程序本身是Scalatra特定的,但我很确定我正在寻找的答案可以使用任何vanilla Scala技术来解决.在这一点上我能做些什么来抓住堆栈跟踪?我不确定请求是否与错误处理程序在同一个线程上,否则可能会有一些答案.e.getStackTrace()给我[Ljava.lang.StackTraceElement;@1f6b6954
这里打印出堆栈跟踪的最佳方法是什么,以便我可以记录并查看它以修复我可怕代码中的错误?
这听起来很基本,但它实际上花了我一整天的时间:我想改变以改变scalatra在开发中运行的端口.我开始使用hello world g8模板,并从那里开始构建.
这是我到目前为止所尝试的:
更改build.scala中的端口,ala文档:http: //www.scalatra.org/guides/deployment/configuration.html 这不能编译,因为端口未定义.
更改build.scala中的端口,这两个示例:https:gist.github.com打瞌睡58af6cfbfe721a562a48 https://github.com/JamesEarlDouglas/xsbt-web-plugin/blob/master/src/sbt-test/web/ servlet/project/Build.scala 同样的问题:端口未定义
重新定义入口点,ala http:www.scalatra.org指导部署standalone.html仍在端口8080上运行
在bootstrap中更改init参数,ala http:www.scalatra.org指导部署配置.仍然在端口8080上运行
任何帮助赞赏.由于某种原因,我无法发布超过2个链接,因此请使用正斜杠替换空格以跟随网址.
这是我的build.scala以防万一.
import sbt._
import Keys._
import org.scalatra.sbt._
import org.scalatra.sbt.PluginKeys._
import com.mojolly.scalate.ScalatePlugin._
import ScalateKeys._
import com.earldouglas.xsbtwebplugin._
import WebPlugin._
object YesManBuild extends Build {
val Organization = "com.prezi"
val Name = "Yes Man"
val Version = "0.1.0-SNAPSHOT"
val ScalaVersion = "2.10.2"
val ScalatraVersion = "2.2.1"
//def Conf = config("container")
lazy val project = Project (
"yes-man",
file("."),
settings = Defaults.defaultSettings ++ ScalatraPlugin.scalatraWithJRebel ++ scalateSettings …Run Code Online (Sandbox Code Playgroud) 我实现了一个Scalatra servlet,现在想要创建一个可执行jar,就像本教程中描述的那样:http://www.scalatra.org/2.2/guides/deployment/standalone.html
我使用IntelliJ IDEA和Scala插件进行开发,并使用sbt来构建和运行我的servlet(我使用sbt-idea来生成项目文件).我的问题是当我尝试编译项目时,无法找到教程中JettyLauncher使用的jetty包.
更新:使用Matt的答案,我能够编译并运行JettyLauncher.但是,我仍然遇到sbt-assembly问题(https://github.com/sbt/sbt-assembly).我按照自述文件中的说明进行操作,但在尝试执行汇编任务时出现以下错误:
[error] Not a valid command: assembly
[error] No such setting/task
[error] assembly
[error] ^
Run Code Online (Sandbox Code Playgroud)
更新2:感谢Matt我现在有一个正在运行的build.scala,我可以使用汇编任务生成一个可执行jar.但是,sbt-assembly不会将/ src/main/webapp的内容添加到jar中.我使用此文件夹来存储我的HTML,CSS和JavaScript文件.如果Scalatra无法匹配路由,它将提供这些文件,这些文件在使用container:start运行servlet时有效.另外,我在/ src/main/webapp/WEB-INF中存储了服务器所需的一些文件.这些文件也没有添加到jar中.
我的build.scala看起来像这样:
import sbt._
import Keys._
import org.scalatra.sbt._
import org.scalatra.sbt.PluginKeys._
import com.mojolly.scalate.ScalatePlugin._
import ScalateKeys._
import sbtassembly.Plugin._
import AssemblyKeys._
object SketchlinkBuild extends Build {
val Organization = "de.foobar"
val Name = "Foobar"
val Version = "0.1"
val ScalaVersion = "2.10.0"
val ScalatraVersion = "2.2.0"
lazy val project = Project (
"foobar",
file("."),
settings = Defaults.defaultSettings …Run Code Online (Sandbox Code Playgroud) 我正在尝试对上传调用进行单元测试,但是我收到以下代码的错误:
@MultipartConfig(maxFileSize = 3145728)
class WebServlet extends ScalatraServlet with FileUploadSupport {
override def isSizeConstraintException(e: Exception) = e match {
case se: ServletException if se.getMessage.contains("exceeds max filesize") ||
se.getMessage.startsWith("Request exceeds maxRequestSize") => true
case _ => false
}
error {
case e: SizeConstraintExceededException => RequestEntityTooLarge("too much!")
}
post("/uploadscript") {
val privateParam = try {params("private") != null && params("private").equals("true") } catch { case _ => false }
println("privateParam = " + privateParam)
val file = fileParams("file")
println(s"The size of the file is …Run Code Online (Sandbox Code Playgroud) 是否有可用于Scala的OAuth2提供程序,我可以使用Scalatra或Play2 Web框架?
我已经看到了这个答案:Scala/Lift的OAuth 2.0提供程序实现
我正在寻找提供程序库而不是OAuth2.0客户端库.
编辑:
我正在寻找Scala OAuth2.0 Provider:http://tuxdna.in/blog/2014/07/09/oauth2-dot-0-server-using-play-2-dot-0-framework-in-斯卡拉/
scalatra ×10
scala ×9
rest ×2
sbt ×2
akka ×1
lift ×1
oauth-2.0 ×1
port ×1
sbt-assembly ×1
scala-2.10 ×1
unit-testing ×1